@Getter@SetterpublicclassPost{privateString title;privateString content;// Lombok이 자동 생성:// public String getTitle() { return title; }// public void setTitle(String title) { this.title = title; }}// 클래스 레벨 또는 필드 레벨 개별 적용 가능publicclassPost{@GetterprivateString title;// title만 getter@Getter@SetterprivateString content;// content는 getter + setter}
@Service@RequiredArgsConstructor// final 필드로 생성자 자동 생성publicclassPostService{privatefinalPostRepository postRepository;// final → 생성자 주입privatefinalCategoryUseCase categoryUseCase;// Lombok이 자동 생성:// public PostService(PostRepository postRepository, CategoryUseCase categoryUseCase) {// this.postRepository = postRepository;// this.categoryUseCase = categoryUseCase;// }}
@Entity@Getter@NoArgsConstructor(access =AccessLevel.PROTECTED)// JPA 기본 생성자 (직접 호출 차단)@AllArgsConstructor// 모든 필드 생성자@Builder// 빌더 패턴publicclassPost{@Id@GeneratedValueprivateLong id;privateString title;privateString content;}
@ToString(exclude ={"password","posts"})// 민감 정보 및 순환 참조 제외@GetterpublicclassUser{privateLong id;privateString email;privateString password;// 제외됨privateList<Post> posts;// 순환 참조 방지를 위해 제외}
@EqualsAndHashCode(of ="id")// id 기준으로만 equals/hashCode@GetterpublicclassPost{privateLong id;privateString title;}
@Slf4j// log 변수 자동 생성@ServicepublicclassPostService{publicPostfindById(Long id){ log.info("게시글 조회: id={}", id); log.debug("상세 디버그 정보"); log.warn("경고 상황"); log.error("에러 발생: {}", id);return postRepository.findById(id).orElseThrow();}}
// JPA 엔티티 표준 패턴@Entity@Table(name ="posts")@Getter@NoArgsConstructor(access =AccessLevel.PROTECTED)@BuilderpublicclassPost{...}// 서비스 레이어 표준 패턴@Service@RequiredArgsConstructor@Slf4jpublicclassPostService{...}// DTO 패턴@Getter@BuilderpublicclassPostResponse{...}