여니의 프로그래밍 study/Spring & Spring Boot

[스프링부트] 어노테이션 모음

여니's 2022. 3. 20. 21:15

@SpringBootApplication

: 스프링 부트의 자동설정,

스프링 Bean 읽기와 생성을 모두 자동으로 설정됩니다.

특히 @SpringBootApplication이 있는 위치부터 설정을 읽어가기 때문에

항상 이 클래스는 프로젝트의 최상단에 위치해있어야 합니다.

@SpringBootApplication
public class SpringbootWebprojectApplication {

   public static void main(String[] args) {
      SpringApplication.run(SpringbootWebprojectApplication.class, args);
   }
   // SpringApplication.run으로 내장 WAS(웹 애플리케이션 서버)를 실행합니다.
   // 내장 WAS란 별도로 외부에 WAS를 두지 않고, 애플리케이션을 실행할 때 내부에서 WAS를 실행하는 것을 의미합니다.
   // 이렇게 되면 항상 서버에 톰캣을 설치할 필요가 없게 됩니다.
   // 스프링 부트로 만들어진 Jar파일(실행 가능한 자바 패키징 파일)로 실행하면 됩니다.
   // 내장 WAS를 사용하면 언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있습니다.
}

 

 

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

위와 같이 webEnvironment 속성이 있을 경우,

테스트의 웹 환경을 설정하는 속성입니다. 

 

기본값은 

WebEnvironment.MOCK입니다.

실제 서블릿 컨테이너를 띄우지 않고 서블릿 컨테이너를 Mocking한 것이 실행됩니다.

 

이 속성값을 사용할 때는 보통 Mockmvc를 주입받아 테스트합니다. 

 

하지만 위 코드는 RANDOM_PORT입니다.

스프링 부트의 내장 서버를 랜덤 포트로 띄웁니다.

이 설정을 실제로 테스트를 위한 서블릿 컨테이너를 띄웁니다.

TestRestTemplate을 주입받아 테스트합니다. 

 

 


@RestController

- Controller를 JSON을 반환하는 Controller로 만들어줍니다. 

@Controller에 @ResponseBody가 결합된 어노테이션입니다. 

 


 

@GetMapping

: HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어줍니다.

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
    // /hello로 요청이 오면 문자열 hello를 반환한다.
}

 


@RunWith(SpringRunner.class)

: 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 합니다.


 

@WebMvcTest

: Web(Spring MVC)에 집중할 수 있는 어노테이션입니다.

선언할 경우 Controller 어노테이션은 사용 가능하지만

Service, Repository, Component 등은 사용이 불가합니다.

 


 

@Autowired

: 스프링이 관리하는 빈(Bean)을 주입 받습니다.

 

 


 

@Getter

: 선언된 모든 필드의 get 메소드를 생성해줍니다.

 

 


@RequiredArgsConstructor

: 선언된 모든 final 필드가 포함된 생성자를 생성해줍니다.

단, final이 없는 필드는 생성자에 포함되지 않습니다.

 


@assertThat

: assertJ라는 테스트 검증 라이브러리의 메소드 중 하나입니다.

검증하고 싶은 대상을 메소드 인자로 받고,

메소드 체이닝이 지원되기 때문에 메소드를 이어 사용이 가능합니다.

https://eboong.tistory.com/515

 

[스프링부트] assertThat 인식 안되는 문제 해결

AssertJ란? : 자바 JUnit의 테스트코드에 사용되어, 테스트코드의 가독성과 편의성을 높여주는 라이브러리입니다. 메서드 체이닝을 지원해서 더 직관적이고 읽기 쉬운 테스트코드 작성이 가능합니

eboong.tistory.com

 


@isEqualTo

: assertJ의 동등 비교 메소드입니다.

assertThat(값1).isEqualTo(값2)

값1과 값2가 같으면 테스트 성공!


@RequestParam

: 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션입니다.

@RequestParam("가져올 데이터의 이름") [데이터타입] [가져온 데이터를 담을 변수] 

"가져올 데이터의 이름"을 "가져온 데이터를 담을 변수"에 해당 값을 바인딩한다.

"가져올 데이터의 이름" == key

 

 

@RequestParam("name") String name

아래 코드에서는

name(@RequestParam("name"))이란 이름으로 넘긴 파라미터를

메소드 파라미터 name(String name)에 저장하게 됩니다. 

// HelloController.java
@GetMapping("/hello/dto")
public HelloResponseDto helloResponseDto(@RequestParam("name") String name,
                                         @RequestParam("amount") int amount){
    return new HelloResponseDto(name,amount);
}

https://eboong.tistory.com/517

 

[스프링부트] 값 넘겨주는 유닛 테스트코드 작성하기(RequestParam)

@RequestParam은 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션입니다. @RequestParam("가져올 데이터의 이름") [데이터타입] [가져온 데이터를 담을 변수] HelloResponseDto.java 응답 데이터를 받을 dto.

eboong.tistory.com


 

@RequestBody

: HTTP 요청의 본문에 담긴 값들을

자바객체로 변환시켜서 객체에 저장합니다.

 

 


 

@ResponseBody

: HTTP 요청의 본문을 자바 객체로 전달받을 수 있습니다.

 

 


@Entity

: 테이블과 링크될 클래스임을 나타냅니다. 

즉 도메인 모델 클래스임을 나타냅니다.


 

@Id

: 해당 테이블의 PK 필드를 나타냅니다.

 


 

@GeneratedValue

: PK의 생성 규칙을 나타냅니다. 

 


@Column

: 이걸 사용하지 않아도 해당 클라스의 필드는 모두 칼럼이 됩니다.

그런데, 굳이 사용하는 이유는

기본값 외에 추가로 변경이 필요한 옵션이 있을 경우 사용합니다.

예를 들어

문자열의 경우 Varchar(255)가 기본값인데, 사이즈를 500으로 늘린다던지

아니면 타입을 text로 변경하고 싶다던지와 같을때 말이죠!

 


@Builder

: 해당 클래스의 빌더 패턴 클래스를 생성합니다.

생성자 상단에 선언할 경우, 생성자에 포함된 필드만 빌더에 포함합니다.

 

정확하게 빌더 패턴이 뭘까요?

: 디자인 패턴 중 하나로

객체의 생성과정과 객체의 표현방법을 분리하는 패턴입니다.

 

왜 쓸까요?

: 가독성이 올라가고, 유지보수가 쉬워지기 때문입니다. 

 

 

빌더 패턴의 장점

1. 필요한 데이터만 설정할 수 있습니다.

 

 

2. 유연성을 확보할 수 있습니다.

: 새로운 변수가 추가되더라도 수정할 필요가 없습니다.

왜냐하면 빌더 패턴은 유연하게 객체의 값을 설정하도록 도와줍니다.

 

 

3. 가독성을 높일 수 있습니다.

: 빌더 패턴을 사용하면 매개변수가 많아져도 가독성을 높일 수 있습니다. 

 

 

4. 변경 가능성을 최소화할 수 있습니다. 

: Setter를 이용하여 구현을 하는 것은 불필요하게 변경 가능성을 열어두는 것입니다.

변경 가능성을 최소화하는 가장 좋은 방법은!

변수를 final로 선언함으로써 불변성을 확보하는 것입니다.

 

final을 붙여줄 수 없는 상황이라면,

setter 또한 넣어주지 않으면 됩니다. 

 

예시를 들어보겠습니다!

public Exm(int a, int b){
	this.a=a
	this.b=b
}

위와 같은 생성자가 있을 때,

new Exm(b,a)처럼 위치를 변경해도

코드 실행전까지 문제점을 찾을 수 없습니다. 

 

하지만 빌더를 사용하게 되면

어느 빌더에 어떤 값을 채워야할지 

명확하게 알 수 있게 됩니다.

Exm.builder()
	.a(a)
    .b(b)
    .build();

 

 


@NoArgsConstructor

: 기본 생성자를 자동으로 추가해줍니다.

public 메서드명(){} 와 같은 효과입니다. 

 

 


@After

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

배포 전 전체 테스트를 수행할 때,

테스트간 데이터 침범을 막기 위해 사용합니다.

 

여러 테스트가 동시에 수행되면,

테스트용 디비인 H2에 데이터가 그대로 남아있어서

다음 테스트 실행 시 테스트 실패가 뜰 수도 있습니다.

 

 


 

@Transactional

클래스나 메서드에 붙여주면,

해당 범위 내 메서드가 트랜잭션이 되도록 보장해줍니다.

 

(더 조사 해야할 부분) 

- 트랜잭션 작동원리

- 트랜잭션의 속성값

참고할 출처

https://www.baeldung.com/transaction-configuration-with-jpa-and-spring

 

트랜잭션에 대해 설명해놓은 게시글입니다.

(본인 참고 위해 링크 걸어둠)

https://eboong.tistory.com/523

 

[스프링부트] 트랜잭션의 의미와 사용 이유

트랜잭션이란? > 데이터베이스의 상태를 변경시키기 위해 수행하는 작업의 단위를 의미합니다. 데이터베이스의 상태를 변경시킨다는 의미는 select, update, delete, insert와 같은 행동을 의미합니다.

eboong.tistory.com

 


 

@LocalServerPort

: 내장 서버 랜덤 포트로 띄우는 어노테이션

 

아래는 포트 번호 확인하는 메서드

@Test
public void Port_번호() throws Exception{
    System.out.println(port);
}

 

 

 

 


참고 서적 및 출처

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

https://velog.io/@joomal/%EB%82%B4%EA%B0%80-%EB%AA%B0%EB%9E%90%EB%8D%98-%EB%A1%AC%EB%B3%B5Lombok

 

내가 몰랐던 롬복Lombok

해당 클래스에 자동으로 빌더를 추가해준다디자인 패턴 중 하나인 빌더 패턴Builder pattern을 의미한다. 객체의 생성 방법과 표현 방법을 분리하는 것을 의미한다.위와 같은 스타일의 자바 코딩을

velog.io