스트링 부트3 자바 백엔드 개발 입문 11~15장

cse 23·2024년 6월 20일
0

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)**으로 이전 상태로 되돌림
  • 주로 서비스 단에서 트랜잭션을 관리

주요 어노테이션

  • @Service: 해당 클래스를 서비스로 인식시켜 빈으로 등록

  • @Transactional: 해당 메서드 또는 클래스 단위로 트랜잭션 처리

    • 전부 성공하거나 전부 실패하게 보장

13장 - 테스트

테스트의 의미

  • 프로그램이 의도대로 작동하는지 검증하는 절차
  • 테스트를 통해 코드의 품질 향상, 리팩터링 용이

테스트 코드 작성법

  1. 예상 데이터 작성
  2. 실제 데이터 획득
  3. 예상값과 실제값 비교 (검증)

테스트 케이스 설계

  • 성공 케이스뿐만 아니라 실패 케이스도 포함
  • 예: 성공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에서 제공하는 인터페이스.
  • CrudRepositoryPagingAndSortingRepository를 상속.
  • CRUD + 페이징 + 정렬 + JPA 특화 기능 제공.

쿼리 메서드와 관련 어노테이션

  • @Query: JPQL(Java Persistence Query Language) 사용하여 메서드 기반 쿼리 작성.
  • 네이티브 쿼리: 실제 SQL을 작성하여 사용할 수 있음 (nativeQuery = true 설정).
  • 네이티브 쿼리 XML: XML 파일로 쿼리를 정의하여 메서드에서 호출 가능.

JPA 테스트 관련 어노테이션

  • @DataJpaTest: JPA 관련 기능 테스트에 특화된 어노테이션. Repository 등 JPA 컴포넌트만 로딩.
  • @DisplayName: 테스트 메서드 이름과는 별개로 출력될 테스트 이름을 지정할 수 있음.

15장: 댓글 CRUD를 위한 REST API 구성

댓글 CRUD 구성요소

  1. REST 컨트롤러: 클라이언트 요청 처리, JSON 응답 반환.
  2. 서비스: 비즈니스 로직 수행, 트랜잭션 관리, 예외 발생 시 롤백.
  3. DTO (Data Transfer Object): 클라이언트와 서버 간 데이터 전송에 사용되는 객체.
  4. 엔티티: 데이터베이스 테이블과 매핑되는 객체.
  5. 리파지터리: 엔티티를 통한 DB 접근 담당, CRUD 메서드 수행.

댓글 엔티티의 주요 메서드

  • 생성 메서드: DTO를 받아 댓글 엔티티를 생성.
  • 수정 메서드: 특정 필드를 업데이트.
public static Comment create(CommentDto dto, Article article) { ... }
public void patch(CommentDto dto) { ... }

스트림(Stream)

  • 리스트나 컬렉션을 반복 처리할 수 있는 함수형 API.

  • for문 없이도 데이터를 깔끔하게 필터링, 정렬, 매핑 가능.

  • 특징:

    • 원본 데이터 불변
    • 결과를 새로운 리스트나 배열로 반환
    • 내부 반복으로 코드 간결성 유지

기타 어노테이션 및 메서드

  • @JsonProperty: JSON 키와 DTO 필드명이 다를 경우, 매핑에 사용.

  • orElseThrow:

    • Optional 객체에 값이 있으면 반환
    • 없으면 지정된 예외 발생시킴
Comment comment = commentRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("댓글 없음"));

0개의 댓글