TIL_220709_입문용 프로젝트 진행

창고·2022년 7월 11일
0
post-custom-banner

들어가기에 앞서
실제 프로젝트 진행했던 코드 내용은 업로드하지 않았습니다

1. 프로젝트 흐름

  • 개발자 생성 (Post method 사용, Validation 이해)
  • 개발자 목록, 특정 개발자 상세 내용 확인 (Get method, DTO)
  • 개발자 정보 수정 (Put method)
  • 개발자 삭제(분리보관), 트랜잭션 (Delete method)

2. 롬복(Lombok)

  • 반복적인 코드 작성을 줄여주는 필수 라이브러리
  • @Setter, @Getter Annotation 추가만으로 Getter/Setter 추가
  • 이미 Getter/Setter가 추가된 부분에 대해서는 Refactor > lombok으로 변환
  • 기존에 toStringOverride해서 값들을 출력하던 것 역시 @ToString 추가로 대체
  • 생성자 관련 Annotation
    • @NoArgsConstructor : 기본 생성자
    • @AllArgsConstructor : 모든 필드를 다 받아야 하는 생성자
    • @RequiredArgsConstructor : final, @NonNull인 필드만 받는 생성자
  • @Data : Getter+Setter+Required...+EqualsAndHashCode+ToString 등 모든 기능 통합
  • @Sl4fj : 로깅 관련 Annotation

3. HTTP와 Request 메시지

  • HTTP(Hyper Text Transfer Protocol)
    • Hyper 텍스트를 전송하는데 활용하는 프로토콜 (약속된 정의)
  • HTTP Request 메시지 스펙
    • 첫째줄 : 요청 라인 (HTTP method, GET / PUT / POST 등)
    • 둘째줄부터 줄바꿈 나오기 전까지 : Header (User-Agent, Accept 등)
    • Header에서 줄바꿈 이후 : Request Body
POST /create-developer HTTP/1.1
// GET / POST 구분 없으 QueryString, RequestBody를 모두 넣을 수 있긴 하나 약속을 한 것...
Content-Type: application/json
Accept: application/json

{
  "developerLevel": "JUNIOR",
  "developerSkillType": "FULL_STACK",
  "experienceYears": 2,
  "memberId": "sunny.flower",
  "name": "sun",
  "age": 36
}
  • HTTP Response 메시지 스펙
    • 첫째줄 : status 상태 라인 (200, 500 등)
    • 둘째줄부터 줄바꿈 나오기 전까지 : Header (User-Agent, Accept 등)
    • Header에서 줄바꿈 이후 : Request Body
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 17 Jul 2021 15:33:34 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
  "developerLevel": "JUNIOR",
  "developerSkillType": "FULL_STACK",
  "experienceYears": 2,
  "memberId": "sunny.flo1wer",
  "name": "sun",
  "age": 36
}

4. 프로젝트 시작

  • Spring Initializr
    • WEB / Lombok / H2 Database / Spring Data JPA / Validation
  • Package 구성
    • Controller / Service / Entity / DTO / Type / Repository / Exception
  • Package 역할
    • Controller : @RestController로 지정, http request를 받아
      Service에 정의된 Business Logic을 호출, ResponseBody에 객체를 받아 반환
    • Service : @Service로 지정, Business Logic을 처리하는 Service Layer
    • Entity : @Entity를 통해 SQL을 통해 연결된 DB에 저장할 수 있는 객체를 구현
    • DTO : Wrapping된 순수한 데이터 객체로 각 Layer간 데이터 교환을 하기 위해 사용
    • Type : enum 타입으로 각종 속성/상태에 대해 정의 (exception 포함)
    • Repository(DAO) : MVC 모델 중의 Model에 해당하는 영역,
      DB의 데이터에 접근하기 위한 객체로 Entity를 통해 데이터를 DB에 저장하는 역할
      (DB 접근 LogicBusiness Logic을 분리하기 위해 사용)
    • Exception : Global exception handlingCustom exception을 정의

(0) controller 생성

  • @RestControllercontroller로 지정
  • http request 값을 json 형식으로 받아 이에 맞는 메소드를 활용, 처리해주는 역할
  • @Sl4fj 으로 로깅 기능 추가

(1) POST 기능 구현

  • controller 내부 @PostMapping을 활용, Post 메소드 추가, service에도 추가
  • entity 구현
  • type에서 enum 타입으로 속성 구현
  • repository 구현
  • dto 내부에 Post에 필요한 객체 생성 dto 구현, 내부에 validation 수행
  • service 구현 및 business validation 수행, exception handling
  • exception 내에 custom exception 구현 (enum 타입)

(2) GET 기능 구현

  • controller@GetMapping을 활용, Get 메소드 추가, service에도 추가
  • dto 내부에 Get에 필요한 정보 확인 시 노출시킬 dto 구현
  • Get 메소드에서는 Entity를 리턴하는 것이 아닌 Dto를 반환
    (불필요한 정보가 외부로 공개되거나 트랜잭션 관련 문제가 발생할 수 있기 때문)

(3) PUT 기능 구현

  • controller@PutMapping을 활용, Put 메소드 추가, service에도 추가
    • PUT : 수정을 하더라도 모든 key-value 값 입력 필요 (입력 안할 시 null로 초기화)
    • PATCH : 요청한 key-value에 대해서만 수정
  • dto 내부에 Put 에 필요한 수정될 정보를 받을 dto 구현
  • service 내부에 추가로 Put 에 대한 validation 수행을 하는 메소드 추가
  • 수정될 정보를 받을 dtorequest 정보를 바탕으로
    repository 내부의 entity 의 정보를 수정한 후, 해당 값을 dto로 반환

(4) DELETE 기능 구현 (분리 보관)

  • controller@DeleteMapping을 이용, Delete 메소드 추가, service에도 추가
  • Delete를 통해 객체를 분리, 보관하기 위해서 삭제되지 않은 객체와 삭제된 객체를 구분하는 enum 타입과 삭제 상태의 entity를 추가
  • 삭제 상태의 entity가 저장될 삭제 상태 객체 저장 repository 추가
  • 삭제, 삭제되지 않음 상태 추가 및 삭제 상태 entity, 삭제 상태 겍체 저장 repository의 추가로 인해 생긴 변동사항 수정 (service, repository 내부 메소드 등)

5. 트랜잭션 (Transaction) 개념

  • 면접에서도 자주 나오는 개념
  • 특정 DB 확실하게 배워보는 것이 중요 (이전에 MySQL 배웠으니 다시 한 번 복습)
  • ACID (예전 티스토리에 있는 내용 재정리, 요약해서 넣어보자)
    • Atomic : 원자성
    • Consistency : 일관성
    • Isolation : 고립성
    • Durability : 지속성

6. 기능 관련

  • ctrl+alt+o : 불필요 import 제거
  • Intellij 편리한 매크로 / 단축키 기능 확인해보기
profile
공부했던 내용들을 모아둔 창고입니다.
post-custom-banner

0개의 댓글