Spring Boot 입문기 – @Getter, @Setter, 그리고 Controller 어노테이션을 처음 마주했을 때
2025. 5. 26. 22:40
728x90

최근 개인 프로젝트를 진행하면서 본격적으로 Spring Boot를 처음 사용하게 되었다.
그동안 Node.js 위주로 백엔드를 개발해왔기 때문에 Java 기반의 Spring 생태계는 익숙하지 않았다.
그래서 하나하나 개념을 정확하게 정리하고 넘어가는 것이 중요하다고 판단했다.

Spring을 사용하면서 가장 먼저 접하게 된 것이 바로 @Getter, @Setter, @RestController 같은 어노테이션들이었다.
처음엔 단순히 자동으로 코드를 줄여주는 도구 정도로 생각했지만, "어떤 상황에서 어떤 어노테이션을 써야 하고, 왜 써야 하는지"가 점점 더 중요하게 느껴졌다.

이 글은 Spring Boot 입문자가 실무에 적응하는 과정에서 마주치는 핵심 어노테이션들을 정리한 기록이다.
Entity와 DTO는 어떤 기준으로 Getter/Setter를 붙여야 할까? Controller에서는 어떤 어노테이션을 왜 쓰는 걸까?
이런 질문에 나 스스로 확신을 갖기 위해, 그리고 나중에 다시 보더라도 명확하게 이해할 수 있도록 정리해봤다.


 1. Lombok의 @Getter / @Setter 사용법과 기준

 각 어노테이션의 역할

어노테이션 설명
@Getter 모든 필드에 대한 getXxx() 메서드를 자동 생성
@Setter 모든 필드에 대한 setXxx() 메서드를 자동 생성
 

 사용 기준 (언제 어떤 걸 붙일까?)

상황 필요한 어노테이션
값을 읽기만 할 경우 @Getter만 사용
외부에서 값을 수정해야 할 경우 (ex. DTO) @Setter도 필요
생성자에서만 값을 설정하고 외부에서 수정되면 안 되는 경우 @Getter만 사용 (Setter는 사용하지 않음)
JPA Entity에서 ID 필드처럼 외부에서 수정되면 안 되는 경우 @Getter만 사용
 

 실전 코드 예시

▶ Entity 예시 - 외부에서 수정되면 안 되는 경우

@Getter
@Entity
public class Item {
    @Id @GeneratedValue
    private Long id;

    private Long sellerId;
    private String title;
    private String description;
    private Integer price;

    private LocalDateTime createdAt;
}​
  • 외부에서 값을 변경할 일이 없기 때문에 @Setter는 생략
  • 조회만 필요하므로 @Getter만 사용

▶ DTO 예시 - 외부에서 바인딩 및 수정이 필요한 경우

@Getter
@Setter
public class ItemRegisterRequest {
    private Long sellerId;
    private String title;
    private String description;
    private Integer price;
}
  • @RequestBody로 JSON을 바인딩하기 위해 @Setter 필요
  • 내부 로직에서 DTO 값을 읽기 위해 @Getter도 필요

 2. Controller에서 사용된 주요 어노테이션 정리

@RestController
@RequestMapping("/api/v1/items")
@RequiredArgsConstructor
public class ItemController {

    @PostMapping
    public ResponseEntity<Long> registerItem(@RequestBody @Validated ItemRegisterRequest request) {
        ...
    }
}

주요 어노테이션 설명

어노테이션 위치 역할
@RestController 클래스 @Controller + @ResponseBody. 기본적으로 JSON 반환
@RequestMapping(...) 클래스 URL 매핑 루트 지정
@PostMapping 메서드 HTTP POST 요청 처리
@RequestBody 파라미터 요청 바디(JSON) → DTO 매핑
@Validated 파라미터 DTO 유효성 검증 활성화 (@NotNull 등 적용)
@RequiredArgsConstructor 클래스 final 필드 기반 생성자 자동 생성 (DI 주입을 위한 생성자 대체)
ResponseEntity<T> 리턴 타입 응답 본문 + 상태 코드 함께 반환
 

 최종 정리표

대상어노테이션사용 이유

 

대상 어노테이션 사용 이유
DTO @Getter, @Setter, @Validated JSON → 객체 변환 및 유효성 검사
Entity @Getter 값 변경 방지 (불변성 유지)
Controller @RestController, @RequestMapping, @RequestBody, @PostMapping 등 RESTful API 구성
생성자 주입 @RequiredArgsConstructor 의존성 주입을 위한 생성자 자동 생성
 

 마무리

Spring Boot를 처음 접하며 느꼈던 가장 큰 어려움은 자동으로 처리되는 어노테이션의 내부 동작 원리와 용도를 명확히 이해하지 못한 채 사용하게 된다는 점이었다.
Lombok은 편리하지만, 아무 생각 없이 Getter/Setter를 남발하면 오히려 객체 지향 설계 원칙을 해칠 수 있다는 점도 깨달았다.

이 글을 정리하면서 "왜 필요한지", "어떤 기준으로 선택해야 하는지"를 스스로에게 설명하듯 글로 정리해보았고, 같은 입장에서 Spring을 시작하는 분들에게도 도움이 되었으면 한다.

앞으로는 @Validated 기반의 DTO 유효성 검증, 그리고 @ControllerAdvice와 @ExceptionHandler를 활용한 예외 처리 흐름까지 이어서 정리할 예정이다.
지금은 작은 조각이지만, 프로젝트 전반을 아우를 수 있는 구조적 이해로 점차 확장해보려고 한다.

이 글은 Spring 입문자가 실무적인 감각을 키워나가는 과정의 일부입니다.
부족한 점이 있다면 언제든지 의견 주세요. 그리고 다음 글도 기대해주세요.

반응형