[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] 정리
#개발서적

[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] 정리

스프링 부트와 AWS로 혼자 구현하는 웹 서비스


테스트 코드 작성

TDD와 단위 테스트는 다른 이야기

※ TDD : 테스트가 주도하는 개발

단위 테스트

  • 기능에 대한 불확실성 감소
  • 문제 발견
  • 리팩토링, 라이브러리 업그레이드 후 기능 작동 확인

단위 테스트를 해야 하는 이유

톰캣을 내렸다 껐다 할 필요 없다.
Print 찍어서 눈으로 확인하지 않는다
새로운 기능이 추가될 때 기존 기능이 잘 작동하는지 확인할 수 있다.


JPA

JPA의 등장 배경

데이터 베이스 모델링에 치중되지 않고 객체지향적으로 프로그래밍하도록 집중
관계형 DB와 객체지향적 언어의 패러다임 일치를 시켜줌

Spring Data JPA

JPA는 인터페이스로서 사용하기 위해 Hibernate 같은 구현체가 필요한데,
구현체를 직접 쓰지않고 Spring Data JPA를 사용한다. 내부적으로 구현체 매핑을 지원함으로 다른 구현체로의 교체가 아주 쉽다

RDB 외에 다른 저장소로 교체가 쉽다. 의존성만 교체.
CRUD 인터페이스는 자동으로 교체됨.

※ 도메인 : 게시글, 댓글, 회원, 정산, 결제 등 소프트웨어에 대한 요구사항 혹은 문제 영역

※ Entity 클래스에서는 절대 Setter 메소드를 만들지 않음

※ Entity 클래스와 Repository는 짝꿍, 같은 위치에 위치해야 함

JPA에 대해

메소드에 쿼리를 날리는 부분이 없다. JPA 영속성 컨텍스트 때문
※ 영속성 컨텍스트 : 엔티티를 영구 저장하는 환경

JPA의 엔티티 매니저가 활성화된 상태로 트랜잭션 안에서 데이터베이스에서 데이터를 가져오면 이 데이터는 영속성 컨텍스트가 유지된 상태,
이 상태에서 데이터를 변경하면 트랜잭션이 끝나는 시점에 해당 테이블에 변경분을 반영한다. (더티 체킹)

등록/수정/조회 API

API를 만들기 위한 3개의 클래스

  • Request 데이터를 받을 DTO 클래스
  • API 요청을 받을 Controller
  • 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service

Spring 웹 계층 ★★★★★

Web Layer

  1. 컨트롤러, 뷰 템플릿 영역
  2. 필터, 인터셉터, 등 외부 요청과 응답에 대한 전반적인 영역

Service Layer

  1. @Service에 사용되는 서비스 영역
  2. 일반적으로 Controller와 DAO의 중간 영역에서도 사용
  3. @Transactional이 사용되어야 하는 영역

Repository Layer

  1. DB와 같은 데이터 저장소에 접근하는 영역
  2. (구 DAO 같은)

DTOS

  1. DTO : 계층 간 데이터 교환을 위한 객체
  2. DTOS : 이들의 영역

Domain Model

  1. 도메인이라 불리는 개발대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화 시킨 것을 도메인 모델이라 함
  2. 택시 앱이라 하면 배차, 탑승, 요금 등이 모두 도메인
  3. @Entity가 사용된 영역도 도메인모델
  4. 꼭 DB 테이블과 관계가 있어야 하는 것은 아님
  5. VO같은 (ReadOnly인 DTO) 값 객체도 이 영역에 해당
  6. 비즈니스 처리를 담당하는 곳 ★

★ Service는 비즈니스 로직을 처리하지 않음, 따로 분리하고 순서만 보장하라
★ Request용 Response용 DTO는 따로 구분할까?

Spring에서 Bean을 주입받는 방식, 이 책에서 권장하는 방식

  1. @Autowired : 권장하지 않음
  2. setter
  3. 생성자 : 권장함

어노테이션

@SpringBootApplication

  • 스프링 부트의 자동 설정, Bean 읽기와 생성, 이곳에서부터 설정을 읽기 때문에 프로젝트 최상단에 위치해야 함

@RestController

  • 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 줌

@GetMapping

  • HTTP 메소드인 Get의 요청을 받을 수 있는 API를 만들어 줌

@RunWith(SpringRunner.class)

  • 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행
  • 스프링 부트 테스트와 JUnit 사이의 연결자

@WebMvcTest

  • 여러 스프링 테스트 어노테이션 중 Web에 집중할 수 있는 어노테이션
  • @Controller, @ControllerAdcvice 등을 사용 가능한데 @Service, @Component, @Repository는 안됨
  • JPA 작동하지 않음

@Autowired

  • 스프링이 관리하는 빈을 주입 받음

@Getter, @Setter

  • lombok 게터 세터 메소드 생성기

@RequiredArgsConstructor

  • 선언된 모든 final 필드가 포함된 생성자를 생성
  • final이 없는 필드는 생성자에 포함 X

@RequestParam

  • 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션

@NoArgsConstructor, @Getter, @Builder

    1. 기본 생성자 자동 추가
    1. 클래스 내 모든 필드의 Getter 메소드를 자동 생성
    1. 빌더 패턴 클래스 생성

MappedSuperClass

  • 이 어노테이션이 선언된 클래스의 컬럼이, 이 클래스를 상속받은 JPA Entity 클래스에 포함된다.

@RequestParam, @PathVariable

  • 이 어노테이션이 선언된 클래스의 컬럼이, 이 클래스를 상속받은 JPA Entity 클래스에 포함된다.

 

728x90

'#개발서적' 카테고리의 다른 글

클린코드 9장  (0) 2023.08.01
클린코드 6~8장  (0) 2023.06.14
클린코드 4~5장  (0) 2023.06.06
클린코드 3장  (0) 2023.06.06
클린코드 1장 ~ 2장  (0) 2023.06.06