※ 읽기 전에 !

 

이번 글은 과제를 하면서 작성한 코드를 이해하고자 내멋대로 주석을 달아본 글이기 때문에, 정답이 아닐 수 있으며 ! 정신 건강을 헤칠수도 있습니다 ^__^

 


 1. HanghaememoApplication

 

@EnableJpaAuditing

  • 스프링 부트의 Entry 포인트인 실행 클래스에 @EnableJpaAuditing 어노테이션을 적용하여 JPA Auditing을 활성화 해준다.
  • 생성일자와 수정일자를 자동으로 등록할 수 있는 기능 외에도 EnableJpaAuditing 에는 다양한 기능이 있다.
  • 이 중 auditorAwareRef 는 @CreatedBy, @LastModifiedBy 과 함께 생성한 사람, 수정한 사람을 자동으로 저장해준다.

 

@SpringBootApplication

  • 스프링 부트의 가장 기본적인 설정을 선언해 주는 어노테이션. 해당 어노테이션을 보면 아래와 같은 어노테이션이 다시 선언되어 있다.
  • @Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 애노테이션으로 합친 것이다.
  • @ComponentScan은 @component 어노테이션 및 @Service, @Repository, @Controller 등의 어노테이션을 스캔하여 Bean으로 등록해주는 어노테이션이다.
  • @EnableAutoConfiguration은 사전에 정의한 라이브러리들을  Bean으로 등록해 주는 어노테이션이다. 
    사전에 정의한 라이브러리들 모두가 등록되는 것은 아니고 특정 Condition(조건)이 만족될 경우에 Bean으로 등록한다.

2. Entity ( Memo, Timestamped)

entity 에서 실제 DB의 테이블과 매칭될 객체들을 명시해준다.

 

Entity/Memo

 

@Entity 어노테이션으로 명시한 부분
DB 테이블에 들어갈 항목들
Service에서 사용할 생성자를 명시해준다.

 

Entity/Timestamped

 

 

3. Controller

Client와 Service 를 연결하는 역할이라고 할 수 있다. 이 과정에서 반환값을 Dto에 담았다. (Delete 부분 제외)

 

  • @RestController는 @Controller에 @ResponseBody가 추가된 것. 당연하게도 RestController의 주용도는 Json 형태로 객체 데이터를 반환하는 것
  • @RequiredArgsConstructor : 이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 준다. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 한다.

 

  • 내가 이해한 바는, 컨트롤러는 클라이언트와 서비스를 연결해 주는 곳이라는 것.
  • 필요한 작업 (메소드)는 서비스클래스에서 처리가 되기 때문에 컨트롤러에서 클라이언트로 부터 받은 requestDto를 서비스에 전달하면 서비스클래스의 메소드가 필요한 작업을 처리하고, 다시 컨트롤러를 통해 클라이언트로 responseDto 형태의 값을 전달한다고 이해하면 되려나 ( ? ) 

 

4. Dto ( MemoRequestDto, MemoResponseDto )

 

Dto는 약간 포장지에 감싸져있는 데이터인 것 같다. 

클라이언트에서 받은 정보를 바로 DB에 저장하고 그걸 다시 클라이언트 쪽으로 전달하게 된다면, 보안상 위험한 부분이 있을 수 있고 나중에 SQL의 join 기능을 사용할 때 문제가 될 수도 있기 때문에, 필요한 데이터가 안전하게 포장되어 있는 것 이라고 이해했다. 아닐 수도 ^_^

 

MemoRequestDto

 

  • 클라이언트에서 입력을 받아 저장되는 데이터들

 

MemoResponseDto

 

  • 클라이언트 쪽에서 요청이 들어왔을 때 꺼내서 보여지는 데이터들. 
  • password는 빠진 것을 볼 수 있다.

 

5. Service

Service는 컨트롤러에서 받아온 데이터 정보를 잘 가공해 DB와 연결된 Repository에 전달 하기도하고, 다시 DB에서 Repository로 보내준 데이터를 가공하여 컨트롤러쪽으로 보내는 역할을 하는 곳이다. 비지니스 로직을 담당하는 곳이기 때문에 메소드들이 모여있는 곳이기도 하다.

 

  • @Service : 해당 클래스가 비즈니스 로직을 담은 Service 클래스임을 명시합니다. @Component 어노테이션을 사용해도 상관 없지만 @Sevice 어노테이션에 @Component 어노테이션의 기능이 포함되어 있고 @Service를 사용함으로써 해당 클래스가 Service의 역할을 하는 것을 명확하게 알 수 있습니다.
  • @RequiredArgsConstructor : 이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 합니다.

 

게시글 POST 메소드 부분

 

  • @Transactional이 붙은 메서드는 메서드가 포함하고 있는 작업 중에 하나라도 실패할 경우 전체 작업을 취소
  • 데이터베이스를 다룰 때 트랜잭션을 적용하면 데이터 추가, 갱신, 삭제 등으로 이루어진 작업을 처리하던 중 오류가 발생했을 때 모든 작업들을 원상태로 되돌릴 수 있다. 이 기능을 하는 어노테이션이 바로 @Transactional

 

 

게시글 전체조회 GET 메소드 부분

 

 

 

게시글 선택 조회 GET 메소드 부분

 

 

 

게시글 수정 PUT 메소드 부분

 

 

 

게시글 삭제 DELETE 메소드 부분

 

 

 

6. Repository

Repository는 Entity에 의해 생성된 DB에 접근하는 메서드를 사용하기위한 interface를 말한다. 저장소와 직접적으로 연결되어 있어 Service에서 필요한 데이터를 DB에서 Entity 클래스로 받아와 다시 Dto로 전달하는 곳이다. 

 

  • 아직 쿼리형식은 공부하지 않았는데, 강의에서 나온대로 쿼리형식으로 지정이 되어있다.
  • 인터페이스란 무엇일까 ? 
  • 인터페이스란 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다. 컴퓨팅에서 컴퓨터 시스템끼리 정보를 교환하는 공유 경계이다.

 


일단 이번 과제에 작성된 코드를 쭉 한번 살펴봤다. 

 

아직 모르는 개념도 많고 어노테이션도 많고 그 외 이해가 되지 않는 부분이 더 많지만, 대략적인 흐름을 알 수 있었던 것 같다.

개발자마다 순서가 조금씩 다르긴 한데, 보통 entity를 먼저 만들고, 그다음 controller를 만들고, 그다음 Repository, 다음  Service와 Dto를 만드는 것 같다. 기술매니저님이 서비스의 규모가 커질 수록 Dto의 수가 늘어나는 것은 당연한 일이기 때문에, Dto를 만드는 것을 불편해 하지 말라고 하셨다. 이번엔 간단한 프로젝트라 두개의 Dto로 끝나긴 했지만, 앞으로 실전 프로젝트를 위해선 원하는 형식의 Dto를 설계하는 법도 공부해야 할 것 같다. 

+ Recent posts