
클라이언트(React, Postman)의 요청을 받는 최전방이다.
핵심 어노테이션
@RestController: 해당 클래스가 REST API 컨트롤러임을 명시. (JSON 반환)
비교: @Controller는 주로 HTML(View)을 반환할 때 사용.
@RequestMapping("/api"): 공통 URL prefix를 설정.
요청 메서드 매핑
@GetMapping("/posts") // 조회 (READ)
@PostMapping("/posts") // 생성 (CREATE)
@PutMapping("/posts/{id}") // 수정 (UPDATE - 전체)
@PatchMapping("/posts/{id}")// 수정 (UPDATE - 일부)
@DeleteMapping("/posts/{id}")// 삭제 (DELETE)
데이터 받기 (Input Handling)
Query String (?name=spring&age=20)
public String search(@RequestParam String name, @RequestParam int age) { ... }
java
Path Variable (/posts/1)
public String getOne(@PathVariable Long id) { ... }
JSON Body ({ "title": "hello", "content": "world" })
public String create(@RequestBody PostDto postDto) { ... }
실제 업무 로직(데이터 가공, 트랜잭션 관리)을 담당한다.
@Service: 해당 클래스가 비즈니스 로직을 담당하는 빈(Bean)임을 명시.
@Transactional: 메서드 실행 중 예외가 발생하면 자동 롤백(Rollback), 성공하면 커밋(Commit) 처리.
@Service
@Transactional(readOnly = true) // 기본적으로 읽기 전용 (성능 최적화)
public class PostService {
@Transactional // 쓰기 작업이 필요한 곳에만 따로 붙임
public void createPost(Post post) {
// ...
}
}
DB와 대화하는 계층이다.
Entity (DB 테이블 매핑)
@Entity // JPA가 관리하는 객체
@Table(name = "posts") // 테이블 이름 지정 (생략 시 클래스 이름)
public class Post {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) // PK & Auto Increment
private Long id;
@Column(nullable = false, length = 500)
private String title;
}
Repository (JPA)
JpaRepository<Entity, ID타입>만 상속받으면 기본적인 CRUD 메서드(save, findById, findAll, delete)가 자동 생성된다.
public interface PostRepository extends JpaRepository<Post, Long> {
// 쿼리 메서드 (이름만으로 쿼리 생성)
List<Post> findByTitleContaining(String keyword);
}
스프링의 핵심인 객체 관리 방법이다.
빈(Bean) 등록
@Component: 일반적인 컴포넌트 등록.
@Configuration + @Bean: 외부 라이브러리(WebClient 등)를 빈으로 등록할 때 사용.
@Configuration
public class WebConfig {
@Bean
public WebClient webClient() {
return WebClient.create();
}
}
생성자 주입 (권장 방식)
@Autowired 필드 주입보다 생성자 주입을 사용하는 것이 테스트와 불변성 유지에 좋다. (final 키워드 사용 가능)
@Service
@RequiredArgsConstructor // Lombok: final 필드에 대한 생성자 자동 생성
public class PostService {
private final PostRepository postRepository;
// (생성자 코드가 자동으로 만들어짐)
}
컨트롤러 전역에서 발생하는 예외를 한 곳에서 잡는다.
@RestControllerAdvice: 모든 컨트롤러의 예외를 가로챔.
@ExceptionHandler(예외클래스.class): 특정 예외가 발생했을 때 실행할 메서드 지정.