11장 - REST 컨트롤러
REST와 API
- REST: HTTP URL로 자원을 명시하고 HTTP 메서드로 CRUD 수행
- API: 클라이언트가 서버의 자원을 사용할 수 있게 해주는 인터페이스
- REST API: REST 방식으로 구현된 API
REST 컨트롤러
- 일반 컨트롤러와 달리, 뷰 대신 JSON 등의 데이터 반환
- 선언:
@RestController
어노테이션 사용
- 요청 타입에 따라 적절한 메서드 (
GET
, POST
, PUT
, DELETE
) 사용
ResponseEntity
- REST API의 응답을 담당하는 클래스
- HTTP 상태 코드, 헤더, 본문을 포함하여 응답 가능
HttpStatus
- HTTP 상태 코드 관련 Enum 클래스
- 예:
HttpStatus.OK
, HttpStatus.BAD_REQUEST
12장 - 서비스와 트랜잭션
서비스 계층
- 컨트롤러와 리포지터리 사이에서 핵심 비즈니스 로직을 담당
- 흐름: 클라이언트 → 컨트롤러 → 서비스 → 리포지터리(DB 접근)
트랜잭션
- 모두 성공하거나 모두 실패해야 하는 일련의 작업
- 처리 중 에러 발생 시 **롤백(Rollback)**으로 이전 상태로 되돌림
- 주로 서비스 단에서 트랜잭션을 관리
주요 어노테이션
13장 - 테스트
테스트의 의미
- 프로그램이 의도대로 작동하는지 검증하는 절차
- 테스트를 통해 코드의 품질 향상, 리팩터링 용이
테스트 코드 작성법
- 예상 데이터 작성
- 실제 데이터 획득
- 예상값과 실제값 비교 (검증)
테스트 케이스 설계
- 성공 케이스뿐만 아니라 실패 케이스도 포함
- 예: 성공1, 성공2, 실패1, 실패2 등 다양한 상황 고려
디렉터리 구조
- 기존 자바 코드는:
src/main/java
- 테스트 코드는:
src/test/java
@SpringBootTest
- 스프링 부트 테스트용 어노테이션
- 테스트 클래스에서 스프링이 관리하는 객체(빈) 주입 가능
14장: JPA 관계 설정과 주요 개념
일대다 관계 / 다대일 관계
대표키(Primary Key) / 외래키(Foreign Key)
- 대표키: 해당 엔티티를 대표하는 유일한 값 (ex: id).
- 외래키: 다른 엔티티의 대표키를 참조하기 위한 속성. 관계 설정에 사용.
다대일 관계 설정
-
자식 엔티티에 외래키 필드를 생성.
-
해당 필드에 부모 엔티티의 대표키를 매핑.
-
JPA에서는 다음 어노테이션 사용:
@ManyToOne
: 자식 → 부모 방향의 다대일 관계 설정.
@JoinColumn(name = "foreign_key_name")
: 외래키 컬럼 이름 지정.
@ManyToOne
@JoinColumn(name = "article_id")
private Article article;
JpaRepository
- Spring Data JPA에서 제공하는 인터페이스.
CrudRepository
와 PagingAndSortingRepository
를 상속.
- CRUD + 페이징 + 정렬 + JPA 특화 기능 제공.
쿼리 메서드와 관련 어노테이션
- @Query: JPQL(Java Persistence Query Language) 사용하여 메서드 기반 쿼리 작성.
- 네이티브 쿼리: 실제 SQL을 작성하여 사용할 수 있음 (
nativeQuery = true
설정).
- 네이티브 쿼리 XML: XML 파일로 쿼리를 정의하여 메서드에서 호출 가능.
JPA 테스트 관련 어노테이션
@DataJpaTest
: JPA 관련 기능 테스트에 특화된 어노테이션. Repository 등 JPA 컴포넌트만 로딩.
@DisplayName
: 테스트 메서드 이름과는 별개로 출력될 테스트 이름을 지정할 수 있음.
15장: 댓글 CRUD를 위한 REST API 구성
댓글 CRUD 구성요소
- REST 컨트롤러: 클라이언트 요청 처리, JSON 응답 반환.
- 서비스: 비즈니스 로직 수행, 트랜잭션 관리, 예외 발생 시 롤백.
- DTO (Data Transfer Object): 클라이언트와 서버 간 데이터 전송에 사용되는 객체.
- 엔티티: 데이터베이스 테이블과 매핑되는 객체.
- 리파지터리: 엔티티를 통한 DB 접근 담당, CRUD 메서드 수행.
댓글 엔티티의 주요 메서드
- 생성 메서드: DTO를 받아 댓글 엔티티를 생성.
- 수정 메서드: 특정 필드를 업데이트.
public static Comment create(CommentDto dto, Article article) { ... }
public void patch(CommentDto dto) { ... }
스트림(Stream)
-
리스트나 컬렉션을 반복 처리할 수 있는 함수형 API.
-
for문 없이도 데이터를 깔끔하게 필터링, 정렬, 매핑 가능.
-
특징:
- 원본 데이터 불변
- 결과를 새로운 리스트나 배열로 반환
- 내부 반복으로 코드 간결성 유지
기타 어노테이션 및 메서드
Comment comment = commentRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("댓글 없음"));