@Service@RequiredArgsConstructor// final 필드 생성자 주입 (Lombok)publicclassPostService{privatefinalPostRepository postRepository;publicPostfindById(Long id){return postRepository.findById(id).orElseThrow(()->newResourceNotFoundException("게시글을 찾을 수 없습니다: "+ id));}publicPostcreate(CreatePostCommand command){Post post =Post.builder().title(command.getTitle()).content(command.getContent()).build();return postRepository.save(post);}}
// application/port/in/PostUseCase.javapublicinterfacePostUseCase{Postcreate(CreatePostCommand command);PostfindById(Long id);}// application/service/PostApplicationService.java@Service@RequiredArgsConstructorpublicclassPostApplicationServiceimplementsPostUseCase{privatefinalPostRepository postRepository;// domain/port/outprivatefinalCategoryUseCase categoryUseCase;// 타 도메인 UseCase (인터페이스)@OverridepublicPostcreate(CreatePostCommand command){// 비즈니스 로직 처리Category category = categoryUseCase.findById(command.getCategoryId());Post post =Post.builder().title(command.getTitle()).category(category).build();return postRepository.save(post);}}
@Service@RequiredArgsConstructor@Transactional(readOnly =true)// 기본적으로 읽기 전용 트랜잭션publicclassPostService{privatefinalPostRepository postRepository;publicPostfindById(Long id){return postRepository.findById(id).orElseThrow();}@Transactional// 쓰기 작업은 별도로 선언 (readOnly = false)publicPostcreate(CreatePostCommand command){return postRepository.save(Post.from(command));}}