티스토리 뷰

Study/Spring

스프링 정리(1)

giiro 2021. 8. 3. 18:21

 

스프링 공부하며 공부한 내용을 정리합니다 ···  

 

1. @Controller vs @RestController


  • @Controller는 주로 view를 반환하기 위해 사용하지만 @RestController는 Json(xml 등..) 형태로 객체 데이터를 반환합니다. 즉, RestController는 @Controller의 역할에 @Responsebody가 추가된 것입니다.

 

2. Mockmvc VS TestRestTemplate


 두 개 모두 처음 접해 무슨 역할을 하는지 몰랐지만 정리하자면 아래와 같습니다.

  • MockMvc는 서버 입장에서 구현한 API를 통해 비즈니스 로직이 문제없이 수행되는지 테스트를 할 수 있다면, TestRestTemplate은 클라이언트 입장에서 RestTemplate을 사용하듯이 테스트를 수행할 수 있습니다.

[출처] TestRestTemplate vs MockMvc

 

3. JPA란?


그림출처

 

  • 인터페이스로서 자바 표준 명세서입니다. 따라서 구현체가 필요한데 대표적으로 Hibernate ...등 많이 쓰이는 것들이 있지만 스프링에서는 주로 SpringData JPA라는 모듈을 이용하여 JPA기술을 다룹니다. 

4. 어노테이션


@Entity

  • 테이블과 링크될 클래스
  • 기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍으로 테이블 이름을 매칭 합니다. (가급적이면 Entity 클래스에서 절대 Setter메서드를 만들지 x)

@id

  • 해당 테이블의 PK필드를 나타냅니다. ( PK는 Long타입의 Auto_increment 사용하는게 좋다..)

@NoArgsConstructor

  • 기본 생성자를 자동 추가합니다.

@Data

  • 롬복 어노테이션으로서 Getter, Setter, 기본 생성자 등을 자동으로 적용합니다.

@Getter

  • 클래스 내 모든 필드의 Getter메소드를 자동 생성합니다.

@After (Junit4) = @Aftereach (Junit5)

  • Junit에서 단위 테스트가 끝날 때마다 수행되는 메서드를 지정합니다. 

@Transactional

  • Transaction이란 DB에서 상태 변화의 한 주기를 의미하고, @Transactional 어노테이션은 해당 어노테이션이 적용되는 메서드를 하나의 트랙젝션으로 묶어주는 역할을 합니다.
  • 아래와 같이 트랙잭션의 개념을 적용한다면 실행 순서를 크게 두 가지 단계로 구분할 수 있고, 이를 어노테이션을 사용하여 간단하게 줄일 수 있습니다.
  • (1) Do something.. : 해당 메서드에서 하고자 하는 작업을 실행한 후, 상태를 commit 하는 단계
  • (2) rollback(status) : 앞서 Do something을 진행하는 과정에서 에러가 터진 경우 그 전의 상태로 롤백하는 단계
// 1. 트랜잭션 개녕을 적용하지 않은 경우
public void f(){
        do something..
    }

// 2. 트랜잭션 개녕을 적용한 경우
public void f() {
    try {
        do something..
    } catch (Exception e){
        rollback(status);
    }
}

// 3. @Transactional을 사용한 경우
@Transactional
public void f() {
    do something..
}​

 

@EntityListeners(AuditingEntityListener.class)

  • BaseTimeEntity 클래스에 Auditing 기능을 포함시킴

@CreatedDate

  • Entity가 생성되어 저장될 때 시간이 저장됨.

 

@Builder

  • 해당 클래스의 빌더 패턴 클래스를 생성

       → 사용시 이점은 전달하고자 하는 변수를 명확히 전달할 수 있습니다.

public class Example{
	private String a;
	private String b; 
}

public Example(String a, String b){
	this.a = a;
	this.b = b;
} 

// #1. 생성자 이용
Example ex = new Example(b, a); // b, a의 위치가 바뀌어도 알기힘듬

// #2. builder 이용
Example ex = Example.builder().a(a).b(b).build(); // 정확하게 명시 가능

5. Spring Web 계층


(1) Web Layer (controllers, exception handlers, filters, view templates ...) → 외부요청과 응답에 대한 전반적인 영역

(2) Service Layer (application services, infrastructure services) → 컨트롤러와 Dao의 중간 영역, 트랜잭션 처리

(3) Repository Layer (repository interfaces - implementations) → DB에 접근하는 영역 (Dao)

(4) Dtos → 계층 간에 데이터 교환을 위한 객체

(5) Domain Model (domain services, entities, value objects) → 비지니스 로직을 처리하는 영역

 

 

6. 스프링에서 Bean을 주입받는 방식


  • (1) @Autowired (2) setter (3) 생성자
  • → 이 중 생성자를 주입받는 방식이 가장 권장됨 ⇒ @RequiredArgsConstructor을 통해서 해결
    • @RequiredArgsConstructor : 초기화되지 않은 @final 필드나 @NotNull이 붙은 필드에 생성자를 생성해줌

 

7. JPA Auditing


  • 엔티티에는 데이터의 생성시간과 수정시간을 포함해야 합니다. 따라서 매번 db에 삽입하기 전 날짜 데이터를 생성, 수정하는 코드를 작성해야 했는데 JPA Auditing 기능을 사용하면 여러 테이블에 있는 공통된 날짜, 시간과 관련된 칼럼들을 자동으로 매핑할 수 있습니다.

'Study > Spring' 카테고리의 다른 글

스프링 정리(3)  (0) 2021.08.13
스프링 정리(2)  (0) 2021.08.08
IOC, DI, 컨테이너  (0) 2021.01.14
회원 도메인 개발 (순수 자바코드로)  (0) 2021.01.14
좋은 객체 지향 설계의 5원칙  (0) 2021.01.14
댓글