종우의 컴퓨터 공간
스프링 부트 개념 및 어노테이션 본문
스프링 부트 테스트
@Runwith(SpringRunner.class)
- 테스트를 진행할 때, JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다.
- 여기서는 SpringRunner이라는 스프링 실행자를 사용한다.
- 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 한다.
@Autowired
- 스프링이 관리하는 빈(Bean)을 주입 받는다.
컨트롤러(Controller); API
@RestController
- 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 준다.
- 예전에는 @ResponseBody를 각 메소드마다 선언했던 것을 한번에 사용할 수 있게 해준다고 생각하면 된다.
@GetMapping
- HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어 준다.
- 예전에는 @RequestMapping(method = RequestMethod.GET)으로 사용되었다.
@PostMapping
- HTTP Method인 Post의 요청을 받을 수 있는 API를 만들어 준다.
@RequrestParam
- 외부에서 API로 넘긴 피라미터를 가져오는 어노테이션이다.
- 여기서는 외부에서 name(@RequrestParam("name")) 이란 이름으로 넘긴 피라미터를 메소드 피라미터 name(String name)에 저장하게 된다.
@PathVariable
컨트롤러 테스트
@WebMvcTest
- 여러 스프링 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션이다.
- 선언 할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있다.
- 단, @Service, @Component, @Repository 등은 사용 할 수 없다.
- 여기서는 컨트롤러만 사용하기 때문에 선언한다.
private MockMvc mvc
- 웹 API를 테스트할 때 사용한다.
- 스프링 MVC 테스트의 시작점이다.
- 이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있다.
- @WebMvcTest와 함께 사용한다.
mvc.perform(get("/hello")
- MockMvc를 통해 /hello 주소로 HTTP GET 요청을 한다.
- 체이닝이 지원되어, 여러 검증 기능을 이어서 선언할 수 있다.
.andExpect(status().isOK())
- mvc.perform의 결과를 검증한다.
- HTTP Header의 Status를 검증한다.
- 우리가 흔히 알고 있는 200, 404, 500 등의 상태를 검증한다.
- 여기선 OK 즉, 200인지 아닌지를 검증한다.
.andExpect(content().string(hello))
- mvc.perform의 결과를 검증한다.
- 응답 본문의 내용을 검증한다.
- Controller에서 'hello"를 리턴하기 때문에 이 값이 맞는지 검증한다.
param
- API 테스트할 때사용될 요청 피라미터를 설정한다.
- 단, 값은 String만 허용된다.
- 그래서 숫자/날짜 등의 데이터도 등록할 때는 문자열로 변경해야만 가능하다.
jsonPath
- JSON 응답값을 필드별로 검증할 수 있는 메소드이다.
- $를 기준으로 필드명을 명시한다.
@SpringBootTest
- 별다른 설정 없이 @SpringBootTest를 사용할 경우 H2 데이터베이스를 자동으로 실행해 준다.
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RAMDOM_PORT)
@LocalServerPort
- 위의 어노테이션에 RAMDOM_PORT 설정과 함께 실행해 주면, 아래 어노테이션이 있는 필드에 자동으로 port 값이 입력된다.
private TestRestTemplate restTemplate
- Api Controller 테스트와 더불어 JPA 기능까지 함께 테스트할 때 사용된다.
- @SpringBootTest와 함께 사용한다.
JPA(Java Persistence API)
- 자바 표준 ORM(Object Relational Mapping); 객체를 매핑한다.
- 영속성 컨텍스트; 엔티티를 영구 저장하는 환경이다.; update 기능에서 DB에 쿼리를 하는 부분이 없다.; 더티체킹
- JPA에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 DB에 자동으로 반영해준다. 이 때 변화가 있다의 기준은 최초 조회 상태이다. JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 스냅샷을 만들어 놓는다. 그리고 트랜잭션이 끝나는 시점에는 이 스냅샷과 비교해서 다른점이 있다면 update 쿼리를 DB로 전달한다.
@Entity
- 테이블과 링크될 클래스임을 나타낸다.
- 기본값으로 클래스의 camel case 이름을 underscore naming(_)으로 테이블 이름을 매칭한다.
ex) SalesManager.java -> sales_manager table
@Id
- 해당 테이블의 PK(Partition Key) 필드를 나타낸다.
@GeneratedValue
- PK의 생성 규칙을 나타낸다.
- 스프링 부트 2.0 에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment가 된다.
@Column
- 테이블의 칼럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼이 된다.
- 사용하는 이유는, 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용한다.
- 문자열의 경우 VARCHAR(255)가 기본값인데, 사이즈를 500으로 늘리고 싶거나, 타입을 TEXT로 변경하고 싶거나 등의 경우에 사용된다.
extends JpaRepository<Entity 클래스, PK 타입>
- Entity Class와 함께 위치해야 한다.
- 기본적인 CRUD 메소드가 자동으로 생성된다.
@MappedSuperclass
- JPA Entity 클래스들이 BaseTimeEntity를 상속 할 경우 필드들(createdDate, modifiedDate)도 칼럼으로 인식하도록 한다.
@CreatedDate
- Entity가 생성되어 저장될 때, 시간이 자동 저장된다.; LocalDateTime 클래스의 필드에 사용한다.
@LastModifiedDate
- 조회한 Entity의 값을 변경할 때 시간이 자동 저장된다.
@Enumerated(EnumType.String)
- JPA로 DB에 저장할 때 Enum 값을 어떤 형태로 저장할지를 결정한다.
- 기본적으로는 int로 된 숫자가 저장된다.
- 숫자로 저장되면 DB로 확인할 때 그 값이 무슨 코드를 의미하는지 알 수 가 없다.
- 그래서 문자열로 저장될 수 있도록 선언한다.
JPA(Java Persistence API) 테스트
<Entity Repository object>.save
- 테이블 <entity>에 insert/update 쿼리를 실행한다.
- id 값이 있다면 update, 없다면 insert 쿼리가 실행된다.
<Entity Repository object>.findAll
- 테이블 <entity>에 있는 모든 데이터를 조회해오는 메소드이다.
<Entity Repository object>.exchange
- update를 할 때 사용된다.
- requestEntity가 필요하며, HttpEntity<...Dto> = newHttpEntity<>(dto 객체)를 이용한다.
서비스(Service)
@Transactional
- Transactional은 업무의 논리적인 단위이다.
- 여러개의 작업을 하나의 논리적 단위로 묶어 반영과 원상복귀(roll-back)을 조정할 수 있기위해 사용한다.
@Transactional(readOnly = true)
- (readOnly = true)를 주면 트랜잭션 범위는 유지하되, 조회 기능만 남겨두어 조회 속도가 개선되기 때문에, 등록, 수정, 삭제 기능이 전혀 없는 서비스 메소드에서 사용하는 것을 추천한다.
JPA Auditing
- Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터벵이스 테이블에 매핑할 때 공통적으로 도메인(엔티티)들이 가지고 있는 필드나 칼럼들이 존재한다. 대표적으로 생성일자, 수정일자, 식별자 같은 것들이다. 데이터베이스에서 누가, 언제 하였느지 기록을 잘 남겨 놓아야하는데 JPA에서는 Audit이라는 기능을 제공하고 있다. Audit은 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능이다. 도메인을 영속성 컨텍스트에 저장하거나 조회를 한 후에 update하는 경우 매번 시간 데이터를 입력해 주어야 하는데, Audit을 이용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주게 된다.
@EnableJpaAuditing
- JPA Auditing 어노테이션들을 모두 활성화 할 수 있도록 Application(Main) 클래스에 활성화 어노테이션을 추가한다.
- HelloControllerTest를 통과하기위해 Application 클래스로부터 따로 분리했으며, config 패키지 밑에 JpaConfig에서 구현했다.
@EntityListeners(AuditingEntityListener.class)
- BaseTimeEntity 클래스에 Auditing 기능을 포함시킨다.
머스테치(Mustache)
{{>layout/header}}
- {{> }}는 현재 머스테치 파일(index.mustache)을 기준으로 다른 파일을 가져온다.
'스프링 부트 (SpringBoot)' 카테고리의 다른 글
템플릿 엔진(Template Engine) (0) | 2021.07.13 |
---|---|
REST API (0) | 2021.07.11 |
롬복 @Builder vs Builder Pattern (2) | 2021.07.08 |
롬복 트러블 슈팅(lombok trouble shooting) (0) | 2021.07.07 |
롬복(lombok) 개념 및 어노테이션 (0) | 2021.07.07 |