본문 바로가기
프로그래밍/Java

[Spring Boot] 알아두면 편리한 Annotation 사용 및 정리

by 서울에서 살아가기 2023. 4. 11.

 

 

 

 

 

 

Spring Boot 개발 프로젝트를 진행할 때 반복된 작업을 줄여주고 생산성 향상을 위해 많은 개발자들이 Annotation을 사용하고 있습니다. 어노테이션을 통해서 빈을 주입받거나, 테스트 환경 구성, 생성자와 getter/setter 등을 쉽게 사용할 수 있게 합니다. 

 

 

 

 기본적인  Annotation 

@SpringBootApplication

해당 어노테이션을 사용하면 Auto-Configuration, Component-Scan 등을 통해 하위에 있는 패키지의 모든 설정과 생성을 자동으로 실행합니다. 어노테이션이 선언된 위치부터 수행되므로 프로젝트 최상단에 선언해야 합니다.

 

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 

추가로 main 메소드 안에 SpringApplication.run으로 내장되어 있는 톰캣(WAS)이 자동으로 실행됩니다. 즉, 프로젝트 개발 완료 후 서비스를 위해 별도의 WAS를 설치할 필요가 없어집니다. 

 

스프링부트에서는 내장 톰캣을 사용하는 것을 권장하고 있습니다. 외부 WAS를 별도로 설치해서 사용하게 되면 모든 서버에서 동일한 환경으로 서비스를 제공야 하기 때문에 WAS 버전 및 설정을 동일하게 사용해야 합니다. 또한 새로운 서버를 증설하게 되면 동일한 환경을 고려하여 서비스를 제공해야 합니다. 이는 서비스가 커져감에 따라 서버 증설 된다면 WAS 환경을 위한 관리 포인트도 증가하고 실수한 여지도 발생할 수 있습니다.

 

 

 

@RestController
public class PostsApiController {
    private final PostsService postsService;

    @PostMapping("/api/v1/posts")
    public Long save(@RequestBody PostsSaveRequestDto requestDto)
    {
        return postsService.save(requestDto);
    }

    @PutMapping("/api/v1/posts/{id}")
    public Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto)
    {
        return postsService.update(id, requestDto);
    }
    
    @GetMapping("/hello/dto")
    public HelloResponseDto helloDto(@RequestParam("name") String name,
                                     @RequestParam("amount") int amount)
    {
        return new HelloResponseDto(name, amount);
    }
}

@RestController

JSON을 반환하는 컨트롤러로 만드는 어노테이션입니다.

 

@GetMapping @PostMapping @PutMapping @DeleteMapping

Http Method Get, Post, Put, Delete의 요청을 수행할 수 있게 합니다. Rest API 규칙에 따라 Get / Post / Put / Delete를 기능에 맞게 변경해서 사용하시면 됩니다.

 

@RequestBody

API호출시 넘겨주는 파라미터를 Java 오브젝트로 변환합니다. JSON이나 XML 등 데이터 포맷에 맞게 호출되었다면 요청된 Param을 Java 오브젝트로 자동 변환합니다.

 

@RequestParam

외부에서 API 호출시 넘겨주는 파라미터를 가져오기 위해 사용합니다.  API에서 name으로 넘긴 파라미터를 String name에 저장하게 됩니다.

 

@PathVariable

URL를 이용하여 파라미터를 처리할 때 사용합니다.

API에 다음과 같이 정의해 두고 "/api/v1/posts/{id}" 실제 API 호출 시 api/v1/post/12으로 호출하면 id에 URL로 입력한 값 '12'가 매칭됩니다.

 

 

@RunWith(SpringRunner.class)
public class PostsApiControllerTest {
    @Autowired
    private PostsRepository postsRepository;

    @After
    public void tearDown() throws Exception {
        postsRepository.deleteAll();
    }

    @Test
    public void Posts_Register() throws Exception{
        String title = "title";
        String content = "content";
        PostsSaveRequestDto requestDto = PostsSaveRequestDto.builder()
                .title(title)
                .content(content)
                .author("author")
                .build();

        String url = "http://localhost:" + port + "/api/v1/posts";
        
        ResponseEntity<Long> responseEntity = restTemplate.postForEntity(url, requestDto, Long.class);
    }
}

@RunWith(SpringRunner.class)

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

JUnit5 버전에서는 @ExtendWith 어노테이션으로 변경되었습니다.

 

@Autowired

스프링부트에서 빈을 주입받기 위해 사용합니다.

스프링부트에서 의존성 주입받는 방식은 3가지입니다.

  • @Autowired
  • 생성자
  • setter

이중 생성자로 주입받는 방식이 선호된다고 합니다. 이 부분은 별도의 주제로 다루도록 하겠습니다.

 

@Test

Test 메서드로 지정하고 단위 테스트를 수행합니다.

 

@After

Junit에서 단위 테스트가 끝날때마다 수행되는 메소드를 지정합니다. 보통은 테스트 수행 후 데이터가 그대로 남아있는걸 방지하려고 테스트 데이터 삭제를 위해 사용합니다.

 

 

 Spring Data Jpa Annotation

@Entity
public class Post extends BaseTimeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

    @Builder
    public Posts(String title, String content, String author)
    {
        this.title = title;
        this.content = content;
        this.author = author;
    }
}

@Entity

데이터베이스 테이블과 연결될 클래스를 설정합니다.

 

@Id

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

Entity에서 PK는 Long 타입을 사용하는것을 추천드립니다. Long 타입은 SQL Server에서 bigint 타입으로 인식됩니다.

 

@GenerateValue

PK의 생성 규칙을 설정합니다. GenerationType.IDENTITY으로 설정해야 PK의 시퀀스가 자동으로 증가됩니다.

 

@Column

테이블의 컬럼 필드로 지정합니다.

컬럼은 설정하지 않아도 클래스에 해당하는 필드는 전부 컬럼으로 자동 설정됩니다. 특정 컬럼 타입이나 크기를 지정할 때 사용합니다.

 

 

 롬복 (lombok)

@Getter
@RequiredArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
public class HelloResponseDto {
    private final String name;
    private final int amount;
    private int total;
}

@Getter @Setter

선언된 모든 필드의 get, set 메소드를 생성합니다.

getName(), setName()와 같은 메소드를 자동으로 생성합니다.

 

@AllArgsConstructor

모든 필드에 대해서 생성자 파라미터로 자동으로 포함시킵니다.

 

예제 클래스에서는 아래와 같이 인스턴스화가 가능하다.

HelloResponseDto responseDto = new HelloResponseDto("kim", 5, 10);

 

@RequiredArgsConstructor

final 키워드가 사용된 필드를 생성자 파라미터로 자동으로 포함합니다.

 

final 키워드로 HelloResponseDto 인스턴스를 생성하면 아래와 같다.

HelloResponseDto responseDto = new HelloResponseDto("lee", 5);

 

@NoArgsConstructor

매개변수가 없는 기본 생성자를 만들어줍니다.

 

파라미터가 없는 기본 클래스 인스턴스를 생각하시면 됩니다.

HelloResponseDto responseDto = new HelloResponseDto();

 

@Builder

해당 클래스의 빌더 패턴 클래스로 사용할 수 있게 합니다.

Posts.builder()
        .title("타이틀명")
        .content("콘텐츠 내용")
        .author("작성자")
        .build());

 

생성자를 통해 매개변수를 입력하게 되면 생성자를 직접 확인하거나 실행하기 전까지 정확하게 입력 됐는지 알 수 없습니다. @Builder를 사용하게 되면 .title("타이틀명") / .content("콘텐츠 내용")을 통해 명시적으로 어느 필드에 어떤 데이터가 입력되는지 알 수 있습니다.

 

 

 

 

 

 

반응형

댓글