상세 컨텐츠

본문 제목

어노테이션 정리

개인 공부/Spring-boot,Java

by 카페코더 2020. 6. 29. 16:00

본문

반응형

Spring-boot 개발 중 등장하는 어노테이션에 대해 정리합니다.


Java

@Enumerated(EnumType.STRING)

JPA로 데이터베이스를 저장할 때, Enum값을 어떤 형태로 저장할지를 결정한다. 기본적으로 int로 된 숫자가 저장된다.

숫자로 저장되면 데이터베이스로 확인할 때 그 값이 무슨 코드를 의미하는지를 알 수 없다. 그래서 문자열(EnumType.STRING)로 저장될 수 있도록 선언한다.

@Target

이 어노테이션이 생성될 수 있는 위치를 지정한다.
ex) ElemetType.PARAMETER - 메소드의 파라미터로 선언된 객체에서 사용할 수 있다.

@Retention

어노테이션이 어떤 시점까지 영향을 미치는지 결정한다. 

  • 인자 목록
    • RetentionPolicy.RUNTIME - 컴파일 이후에도 JVM에 의해서 참조가 가능하다.
    • RetentionPolicy.CLASS - 컴파일러가 클래스를 참조할 때 까지 유효하다.
    • RetentionPolicy.SOURCE - 어노테이션 정보가 컴파일 이후 없어진다.

Spring

@Required

Required를 직역하면, '필수' 이다.

말 그대로 필수 멤버변수(이하 프로퍼티)를 명시할 때 사용되며, 스프링 2부터 제공된다. 필수 프로퍼티를 지정하려면, 먼저 프로퍼티 설정 메소드에 @Required 어노테이션을 붙여야 한다.

간단한 DTO 예제로 @Required를 살펴보자.

public class User {
    private String name;
    private int age;

    @Required
    public void setName (String name) { // 1
        this.name = name;
    }

    public void setAge (int age) { // 2
        this.age = age;
    }
}

 

보면, 1번 항목에 @Required 어노테이션이 붙어있다.

1번과 같이 @Required 어노테이션이 붙어있다면, 해당 함수는 필수항목을 의미한다. 즉, name 프로퍼티를 반드시 선언해야 한다는 의미인데, 이것을 무시하면 예외가 발생하게 된다.

또한, 단순히 초기화 하는 경우 뿐 아니라 Request를 통해 값을 전달받을 때 또한 예외가 발생하게 된다.

 

@SpringBootApplication

SpringBootApplication 어노테이션은 다음 3가지의 어노테이션을 추가한것 과 같다.

  • @Configuration
  • @EnableAutoConfiguration
  • @ComponentScan

@RestController

컨트롤러를 JSON을 반환하는 컨트롤러로 만들어준다.
각 메소드마다 @ResponseBody를 선언했던 것을 한번에 사용할 수 있게 해준다.

@GetMapping

HTTP Method Get의 요청을 받을 수 있는 API를 만든다.

 

package com.tistory.cafecoder.springboot.web;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void hello() throws Exception{
        String hello = "hello";

        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
}

@RunWith(SpringRunner.class)

테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다.
여기서는 SpringRunner라는 스프링 실행자를 사용한다.
, 스프링 부트 테스트와, JUnit 사이의 연결자 역할을 한다.

@WebMvcTest(controllers = HelloController.class)

여러 스프링 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션이다.
선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있다.
, @Service, @Component, @Repository 등은 사용할 수 없다.
여기서는 컨트롤러만 사용하기 때문에 문제없이 사용이 가능하다.

@Autowired

스프링이 관리하는 빈을 주입받는다.

@RequestParam

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

@Service

Service 클래스임을 명시한다. 
Controller에서 넘어온 값들에 대해 Exception 처리 및 해당하는 Model을 호출하는 기능을 담당한다.

@CreateDate

Entity가 생성되어 저장될 때 시간이 자동 저장된다.

@LastModifiedDate

조회한 Entity의 값을 변경할 때 시간이 자동 저장된다.

@Transactional

Transaction의 개념 및 특징은 아래 포스팅을 참고하자.

 

Transaction

Transaction 탄생 배경 데이터베이스의 상태를 변환 시키는 하나의 논리적인 기능의 작업 단위를 말한다. 데이터 베이스를 다루다 보면, 쿼리 한 줄로 해결할 수 없는 경우가 많다. 또, 여러개의 쿼�

cafecoder.tistory.com

트랜잭션의 범위 및 규칙을 정의한다. 추가로, Spring은 코드 기반의 트랜잭션 처리 및 선언적 트랜잭션을 지원한다. 스프링이 제공하는 트랜잭션을 지원한다. 

트랜잭션의 범위 및 규칙설정의 예시로, @Transactional(readOnly = true)를 예시로 들 수 있다.

    @Transactional(readOnly = true)
    public List<PostsListResponseDto> findAllDesc() {
        return postsRepository.findAllDesc().stream()
                .map(PostsListResponseDto::new)
                .collect(Collectors.toList());
    }

위와 같이 "readOnly = true"를 인자로 추가하면, 트랜잭션 범위는 유지하되, 조회 기능만 남겨두어 조회 속도가 개선된다. 때문에, 등록, 수정, 삭제 기능이 전혀 없는 서비스 메소드에 사용하는 것을 추천한다.


lombok

@Getter

선언된 모든 필드의 Getter 메소드를 자동 생성해준다.

@RequiredArgsConstructors

선언된 모든 필드가 포함된 생성자를 생성해준다.

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

@NoArgsConstructor

기본 생성자 자동 추가

public Posts() {}와 같은 효과.

@Builder

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

생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함


JPA

@Entity

테이블과 링크될 클래스임을 나타낸다.
기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍으로 테이블 이름을 매칭한다.
(productName -> product_name)

@Id

해당 테이블의 PK필드를 나타낸다.

@GeneratedValue

PK의 생성 규칙을 나타낸다.
스프링부트 2.0 에서는 GeneratedType.IDENTITY 옵션을 추가해야 auto_increment가 된다.

@Column

테이블의 칼럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼이 된다.
사용하는 이유는 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용한다.
문자열의 경우 VARCHAR(255)가 기본값인데, 사이즈를 500으로 늘리고 싶거나, 타입을 TEXT로 변경하고 싶은 경우 등 사용된다.

@MappedSuperClass

JPA Entity 클래스들이 @MappedSuperClass 어노테이션으로 명시된 클래스를 상속받을 경우, 내부에 선언 된 필드들도 칼럼으로 인식하도록 한다.

@EntityListeners(AuditingEntitiyListener.class)

클래스에 Auditing 기능을 포함시킨다.

@Query("SQL 문법")

해당 어노테이션으로 명시한 자료구조에 SQL문법을 통해 검색 된 내용을 적용한다.

 

반응형

관련글 더보기

GitHub 댓글

댓글 영역