10a Bean 생명주기·IoC 📚 전체 맵 11a Docker 개념
Series 10 · Bean·어노테이션 · 2/2

ANNO
TATION
TOTAL

프로젝트 전체 어노테이션 총집합 · 계층별 분류
Spring MVC · JPA · Security · Lombok · Java 표준

10a Bean 생명주기·IoC 10b 어노테이션 완전 정리
01~09 Java·Spring·JPA 10 Bean·어노테이션 11 Docker 12 용어사전·면접Q&A
이 파일의 학습 목적
10b — Spring 어노테이션 완전정복

프로젝트 코드 전체에 흩어진 어노테이션들을 역할별로 한 번에 정리한다. Bean 등록·URL 매핑·파라미터·응답·보안·JPA — 어떤 어노테이션이 어느 계층에서 어떤 역할을 하는지 완전히 체계화한다.

이 파일에서 배울 것
  • Bean 등록·계층 어노테이션 — @Service @Repository 등
  • URL 매핑 — @GetMapping @PostMapping @RequestMapping
  • 파라미터·요청 데이터 — @PathVariable @RequestBody 등
  • 응답·예외 — @ResponseBody @ExceptionHandler
  • JPA·Lombok·Security — 계층별 전체 정리
프로젝트 코드 연결
  • · 1차~3차 프로젝트 전 계층 어노테이션 총망라
  • · @AuthenticationPrincipal — 3차 Security
  • · @Transactional(readOnly=true) — 심화
  • · Lombok — @Builder @NoArgsConstructor
시리즈 순서: 10a Bean 생명주기 → 10b ← 지금 여기 → 11 Docker 시리즈
01 — Bean 등록 · 계층 어노테이션
Spring이 클래스를 인식하고 Bean으로 등록하는 어노테이션
🏷️ 클래스 레벨 — Bean 등록 Component Scan
@SpringBootApplication
앱 시작점. 이 패키지 하위 전체 컴포넌트 스캔 + 자동 설정
Spring Boot
@Component
범용 Bean 등록. @Service·@Repository·@Controller의 부모 어노테이션
Spring
@Controller
웹 컨트롤러. 메서드 반환값이 View 이름 (1차 Thymeleaf)
Spring MVC
@RestController
@Controller + @ResponseBody. 메서드 반환값이 JSON (2·3차)
Spring MVC
@Service
비즈니스 로직 계층. @Transactional 주로 여기에 붙임
Spring
@Repository
DB 접근 계층. JpaRepository 상속 시 자동 등록 (직접 안 써도 됨)
Spring + JPA
@Configuration
설정 클래스. 내부 @Bean 메서드로 수동 Bean 등록
Spring
@Bean
@Configuration 안에서 메서드 반환 객체를 Bean으로 등록
Spring
02 — URL 매핑 어노테이션
HTTP 메서드 + URL을 Controller 메서드에 연결
🔀 메서드 레벨 — 요청 매핑 Request Mapping
@RequestMapping
클래스 레벨 공통 URL 설정. @GetMapping 등의 부모
Spring MVC
@GetMapping
GET 요청 처리. 데이터 조회 (목록·상세)
Spring MVC
@PostMapping
POST 요청 처리. 데이터 생성 (로그인·글쓰기·회원가입)
Spring MVC
@PutMapping
PUT 요청 처리. 데이터 전체 수정
Spring MVC
@DeleteMapping
DELETE 요청 처리. 데이터 삭제
Spring MVC
@PatchMapping
PATCH 요청 처리. 데이터 일부 수정
Spring MVC
03 — 파라미터 · 요청 데이터 어노테이션
HTTP 요청에서 값을 꺼내는 방법들
📥 메서드 파라미터 레벨 Request Params
@RequestBody
HTTP 요청 body의 JSON → Java 객체 자동 변환. axios POST/PUT 데이터 수신
Spring MVC
@ModelAttribute
HTML form 데이터 → Java 객체 변환. 1차 Thymeleaf 방식
Spring MVC
@PathVariable
URL 경로 변수 꺼내기. /board/detail/{id} → id 값
Spring MVC
@RequestParam
쿼리스트링 파라미터 꺼내기. /list?page=2 → page 값. defaultValue 설정 가능
Spring MVC
@ResponseBody
메서드 반환값을 JSON으로 변환해 응답. @RestController 쓰면 전체 적용
Spring MVC
@AuthenticationPrincipal
SecurityContext에서 현재 로그인 유저 꺼내기. CustomUserDetails 객체로 받음
Security
Java — 파라미터 어노테이션 실제 사용 예
@GetMapping("/api/board/detail/{id}")
public ResponseEntity<?> detail(
@PathVariable Long id, // URL 경로 값
@AuthenticationPrincipal CustomUserDetails userDetails) { // 로그인 유저
User loginUser = userDetails.getUser();
return ResponseEntity.ok(boardService.getDetail(id));
}

@PostMapping("/api/board/write")
public ResponseEntity<?> write(
@RequestBody BoardDto dto, // JSON → 객체
@AuthenticationPrincipal CustomUserDetails ud) {
boardService.write(dto, ud.getUser());
return ResponseEntity.ok("작성 완료");
}
04 — JPA 어노테이션
Entity 매핑 · 연관관계 · 생명주기 콜백
🗃️ Entity 레벨 JPA
@Entity
이 클래스를 DB 테이블과 매핑. JPA가 관리하는 영속 객체
JPA
@Table
테이블명 지정. 생략 시 클래스명 소문자로 자동 생성
JPA
@Id
Primary Key 지정. @GeneratedValue와 함께 사용
JPA
@GeneratedValue
PK 자동 생성 전략. IDENTITY = DB 자동증가(AUTO_INCREMENT)
JPA
@Column
컬럼 옵션 설정. nullable, unique, length, name 등
JPA
@ManyToOne
다대일 연관관계. FK 보유 쪽(Many)에 선언. fetch=LAZY 권장
JPA
@OneToMany
일대다 연관관계. mappedBy 필수. DB에 새 컬럼 안 만듦
JPA
@JoinColumn
FK 컬럼명 지정. name = "user_id"
JPA
@PrePersist
INSERT 직전 자동 실행. createdAt 자동 설정, 기본 role 설정
JPA
@PreUpdate
UPDATE 직전 자동 실행. updatedAt 자동 설정
JPA
@Transactional
DB 트랜잭션 처리. 더티체킹 활성화. 예외 시 자동 rollback
Spring AOP
@Query
JPQL 직접 작성. fetch join, 복잡한 조건 쿼리
Spring Data JPA
05 — Spring Security 어노테이션
인증·인가·JWT 관련 어노테이션
🔐 Security 레벨 Security
@EnableWebSecurity
Spring Security 활성화. SecurityConfig에 붙임
Security
@AuthenticationPrincipal
SecurityContext에서 현재 인증된 유저 주입. CustomUserDetails로 받아 getUser()로 실제 Entity 접근
Security
@Value
application.properties 값 주입. @Value("${jwt.secret}") private String secret
Spring
@CrossOrigin
Controller 레벨 CORS 허용. WebConfig보다 간단하지만 범위 좁음
Spring MVC
Java — @AuthenticationPrincipal · @Value 실제 사용
// @AuthenticationPrincipal — 로그인 유저 꺼내기
@GetMapping("/api/user/me")
public ResponseEntity<?> myInfo(
@AuthenticationPrincipal CustomUserDetails userDetails) {
User user = userDetails.getUser(); // 실제 User Entity
return ResponseEntity.ok(user.getNickname());
}

// @Value — application.properties에서 값 주입
@Component
public class JwtUtil {
@Value("${jwt.secret}") // application.properties의 jwt.secret 값
private String secret;

@Value("${jwt.expiration}") // jwt.expiration 값
private Long expiration;
}
06 — Lombok 어노테이션
반복 코드 자동 생성 — getter·setter·생성자를 어노테이션 하나로
🔧 Lombok 레벨 Lombok
@Getter
모든 필드의 getXxx() 메서드 자동 생성
Lombok
@Setter
모든 필드의 setXxx() 메서드 자동 생성. Entity에는 지양
Lombok
@NoArgsConstructor
파라미터 없는 기본 생성자 자동 생성. JPA Entity 필수
Lombok
@AllArgsConstructor
모든 필드를 파라미터로 받는 생성자 자동 생성
Lombok
@RequiredArgsConstructor
final 필드만 받는 생성자 자동 생성. DI(의존성 주입)에 필수
Lombok
@Builder
빌더 패턴 자동 생성. Board.builder().title("...").build()
Lombok
@ToString
toString() 메서드 자동 생성. 로그 출력용
Lombok
@Data
@Getter + @Setter + @ToString + @RequiredArgsConstructor 합본. DTO에 주로 사용
Lombok
07 — Java 표준 · 기타 어노테이션
Spring이 아닌 Java 표준 어노테이션
Java 표준 레벨 Java
@Override
부모 클래스나 인터페이스 메서드 재정의. 컴파일러가 검증
Java
@FunctionalInterface
람다로 사용 가능한 함수형 인터페이스 표시 (추상 메서드 1개)
Java
@PostConstruct
Bean 생성 + DI 완료 직후 실행. 초기 데이터 설정에 사용
Jakarta EE
@PreDestroy
컨테이너 종료 직전 실행. 리소스 정리
Jakarta EE
@Autowired
의존성 자동 주입. 생성자 주입(@RequiredArgsConstructor)으로 대체 권장
Spring
💡 @Autowired vs @RequiredArgsConstructor
둘 다 의존성 주입 — 결과는 같지만 방식이 다름
@Autowired = 필드 직접 주입 (테스트 어려움, 현재 비권장)
@RequiredArgsConstructor + private final = 생성자 주입 (현재 표준)
08 — 빠른 참조표
면접에서 나오는 어노테이션 — 한눈에 정리
참조 — 계층별 어노테이션 요약
// ── Controller 계층 ──────────────────────────────
@RestController // Bean 등록 + JSON 응답
@RequestMapping // 클래스 공통 URL
@GetMapping // GET 요청
@PostMapping // POST 요청
@PutMapping // PUT 요청
@DeleteMapping // DELETE 요청
@PathVariable // URL 경로 값 (/board/{id})
@RequestParam // 쿼리스트링 (?page=2)
@RequestBody // JSON → 객체
@AuthenticationPrincipal // 로그인 유저

// ── Service 계층 ─────────────────────────────────
@Service // Bean 등록
@Transactional // DB 트랜잭션 + 더티체킹
@RequiredArgsConstructor // 생성자 DI

// ── Repository 계층 ──────────────────────────────
@Repository // Bean 등록 (JpaRepository 상속 시 생략 가능)
@Query // JPQL 직접 작성
@EntityGraph // N+1 해결 fetch join

// ── Entity 계층 ──────────────────────────────────
@Entity // DB 테이블 매핑
@Id @GeneratedValue // PK 자동 증가
@Column // 컬럼 옵션
@ManyToOne(fetch=LAZY) // 다대일 연관관계
@JoinColumn // FK 컬럼명
@PrePersist // INSERT 직전 자동 실행

// ── 공통 / 설정 ──────────────────────────────────
@Configuration // 설정 클래스
@Bean // 수동 Bean 등록
@Value // application.properties 값 주입
@PostConstruct // Bean 초기화 직후 실행
@Getter @Setter // Lombok
10a Bean 생명주기·IoC 📚 전체 맵 11a Docker 개념