Spring Boot

☑️[SPRING] 어노테이션 모음

재원쓰 2022. 12. 6. 20:01

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false)
@Getter
private로 선언된 변수는 꺼낼수가 없는데, 이걸 추가하면 get변수명 함수가 자동생성되어 값을 꺼낼 수 있다.
@Setter

객체에 선언된 멤버변수를 'set변수명()'으로 간단하게 값을 수정할 수 있다. 하지만 어디서 수정되었는지 찾기 어려워 실무에서는 절대 사용하면 안된다.
@AllArgsConstructor

모든 필드 값을 파라미터로 받는 생성자를 만들어준다.

// 🔥 적용 전
public class MemberDto{
    private String name;
    private int price;
    private int count;
    public MemberDto(String name, int price, int count) {
        this.name = name;
        this.price = price;
        this.count = count;
    }
}

// 🔥 적용 후
@AllArgsConstructor
public class MemberDto{
    private String name;
    private int price;
    private int count;
}


@NoArgsConstructor(access = AccessLevel.PROTECTED)
파라미터가 없는 기본 생성자함수를 생성해준다. access 속성을 이용해 생성자 함수를 잠금할 수 있다. 생성자 함수가 잠금되었다면 따로 생성자 메서드가 필요할 것이다.

// 🔥 적용 전
public class MemberDto{
    private String name;
    private int price;
    private int count;
    public MemberDto() {
    }
}

// 🔥 적용 후
@NoArgsConstructor
public class MemberDto{
    private String name;
    private int price;
    private int count;
}


@RequiredArgsConstructor
내가 원할때마다 다른 클래스를 가져와 멤버변수로 선언할 때, final을 추가하면 자동으로 생성해준다. 
이때, 해당클래스(Controller)가 생성될 때 멤버변수 선언이 꼭 필요한 것임을 알려주기 위해 선언해준다.

// 🔥 수정 전
public class ProductController {
    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }
}

// 🔥 수정 후
@RequiredArgsConstructor
public class ProductController {
    private final ProductService productService;

    //아래는 생략이 가능해졌다.
    //@Autowired
    //public ProductController(ProductService productService) {
    //    this.productService = productService;
    //}
}


@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Component
@Service 🔥내부적으로 어떻게 동작하는지
@SpringBootApplication
@RequestMapping("/request")
@GetMapping("/form/html")
@ResponseBody
자바객체를 HTTP요청의 바디내용으로 매핑하여 클라이언트로 전송한다. controller 클래스가 @RestController로 묶여있다면 자동으로 @ResponseBody가 붙게되어 생략이 가능하다.
@RequestBody
http 요청의 본문(body)이 그대로 전달된다. 클라이언트에서 xml이나 json을 기반으로 요청한 경우에 사용한다.
public String helloRequestPath(@PathVariable String name, @PathVariable int age)
@RequestParam(value = "offset", defaultValue = "0") int offset

클라이언트에서 API 요청 시 쿼리스트링으로 값을 전달할 때 받아오는 방식이다. 속성을 써줄 필요는 없지만 value로 키 이름을 바꿀 수 있고 넘겨온 값이 없을 때 defaultValue를 이용해 기본값 설정도 가능하다.다.public String helloRequestBodyForm(@ModelAttribute Star star)
public String helloPostRequestJson(@RequestBody Star star)
@RequestMapping("/response")
@Controller
api 생성할 컨트롤러 파일에 적용. html파일을 반환하는 api를 반드시 포함해야함.
@RestController
api 생성할 컨트롤러 파일에 적용. html파일 반환 api를 포함하지 말아야 함.
@RequestMapping("/rest")
@OneToMany(mappedBy = "food", fetch = FetchType.EAGER)
연관관계의 거울이다. mappedBy 속성에 넣는 값은 ManyToOne쪽 테이블에 있는 해당 필드에 의해서 맵핑되었다는 뜻이다.
@ManyToOne(fetch = FetchType.LAZY)
다대일(n:1) 관계 선언. 이 어노테이션이 선언된 쪽이 FK를 가지며, 연관관계의 주인이 된다. fetch 속성 기본값이 EAGER인데 반드시 LAZY로 변경해주어야 한다.
@JoinColumn(name = "food_id")
다대일에서 다(n)쪽에 FK를 설정하게 된다. name 속성 안에 들어가는 값이 FK 이름이 된다.

@ManyToMany
@JoinTable(name="category_item",
    joinColumns = @JoinColumn(name = "category_id"), // 테이블의 연관관계 주인쪽에 들어가는 부분
    inverseJoinColumns = @JoinColumn(name = "item_id") //테이블의 맵핑 되는쪽에 들어가는 부분
)
실무에서는 절대 쓰지 말아야할 어노테이션이다. ManyToMany로 썼을 경우에 추가하는 어노테이션으로 중간테이블을 만들어주고, 연관관계의 주인도 설정해주는 역할을 한다.

@OneToOne(fetch = FetchType.LAZY)
1:1관계 선언. 연관관계의 주인은 상대쪽 데이터를 더 많이 불러오는 쪽으로 지정하면 된다. fetch 속성 기본값이 EAGER이니 반드시 LAZY로 변경해주어야 한다.

@Transactional
DB 바꾸는걸 트랜잭션(Transaction)이 일어난다고 한다. 함수의 작업이 DB 관련 작업일 땐 이 어노테이션을 넣어줘야 DB 정보가 업데이트 된다.
@Table(name = "memo2")
@MappedSuperclass
타임스탬프 클래스를 상속한 엔티티가 자동으로 생성시간(CreatedDate)과 수정시간(LastModifiedDate)을 컬럼으로 잡도록 도와준다.

@EntityListeners(AuditingEntityListener.class)
타임스탬프 클래스를 상속한 엔티티가 변화하는 것을 지켜보고 있다. 변화가 일어나면 자동으로 업데이트 해준다.
@EnableJpaAuditing
시간 자동변경이 가능하도록 해준다. 타임스탬프를 사용할 때 반드시 필요하며, application.java 파일에 선언해주어야 한다.
@CreatedDate
생성시간
@LastModifiedDate
수정시간
@Enumerated(EnumType. STRING) 

필드값이 Enum 타입인데 문자인 경우 DB에서는 Enum 순서대로 숫자로 변환하여 들어간다. 이걸 문자로 보여지게 할 때 쓰인다.
@Temporal (TemporalType. TIMESTAMP)
@RequestMapping("/api")
@Slf4j
로그 라이브러리가 여러개 있는데 @Slf4j는 다양한 라이브러리들을 하나의 통일된 방식으로 사용할 수 있게 해준다.
@ComponentScan
이게 설정된 패키지의 하위 패키지에서만 @Component와 @Bean을 쓸 수 있다. @SpringBootApplication에의해 default로 설정되어 있다.
@Component
이게 걸린 클래스를 빈으로 등록해준다. 이게 달려있는 클래스는 'IoC 컨테이너'에 저장된다.
@Configuration, @Bean 
@Component을 사용해 자동으로 빈을 등록하는게 아닌, 직접 객체를 생성해 빈으로 등록을 요청한다.
@Valid
유효성 검사

 

@RequiredArgsConstructor

생성자주입의 단점은 위의 Constructor(생성자) 코드처럼 생성자를 만들기 번거롭다는 것이다. 하지만 이를 보완하기위해 롬복을 사용하여 간단한 방법으로 생성자 주입 방식의 코딩을 할 수 있다.

final이 붙거나 @NotNull 이 붙은 필드의 생성자를 자동 생성해주는 롬복 어노테이션

 

@Value("${jwt.secret.key}")

application.properties에 있는 키 값을 가져올 수 있다.

 

@PostConstruct

클래스가 service(로직을 탈 때)를 수행하기 전에 발생한다. 이게 붙은 메서드는 다른 리소스에서 호출되지 않는다해도 실행된다.

 

@AuthenticationPrincipal

매게변수에 선언하는 것으로 인증에 성공하게 되면 인증 정보가 담긴 사용자 객체를 리턴받을 수 있다.

 

@PersistenceContext

스프링부트가 EntityManager 클래스로 만든 객체를 주입(injection)해준다. 레포지토리 클래스에 쓰고 시작하면 된다. 스프링부트에서는 @Autowired로 넣어도 되고, 다른 방식들처럼 @RequireArgsConstructor을 사용할 수도 있다.

@PersistenceUnit

EntityManagerFactory를 직접 주입하고 싶을 경우에 넣어주지만 보통은 @PersistenceContext가 자동으로 주입해주는 것으로 사용하기 때문에 쓸 일이 없다.

 

@RunWith(SpringRunner.class)

junit한테 스프링과 관련된 것을 테스트 할거라고 알려준다.


@SpringBootTest

스프링 부트로 테스트를 돌린다고 선언한다.

 

@Rolleback(false)

테스트코드 작성 시 db에 데이터 변동이 일어나면 테스트코드가 끝날 때 전부 롤백이 되어서 사라진다. 하지만 이 어노테이션을 선언하면 롤백을 취소해서 db에 변경사항을 눈으로 확인할 수 있다.

 

@Embeddable

jpa의 내장타입. 이 어노테이션이 선언된 클래스는 어딘가에 내장이 될 수 있다.

 

@Embedded

엔티티 멤버변수에 선언하는 어노테이션이다. 내장 타입을 포함했다는 것을 표시한다.

 

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

상속 관계인 테이블에서 맵핑 전략을 지정해준다

(SINGLE_TABLE: 한테이블에 때려박기, TABLE_PER_CLASS: 상속받은 클래스만 테이블로 만들어지게, JOINED: 모든 테이블 전부)


@DiscriminatorColumn(name="dtype")

싱글테이블 패턴에서 DB가 상속받은 클래스 테이블을 구분해야하기 때문에 구분할 기준이 있음을 선언한다. 부모클래스에 선언한다.


@DiscriminatorValue("B")

싱그 테이블이니까 DB 입장에서 구분할 방법을 알려주기 위해 명칭을 나눈다. 자식클래스에 선언한다.

 

@Enumerated(EnumType.STRING)

테이블 컬럼에서 enum 타입을 변수로 지정할 때 선언해줘야 한다. EnumType 속성에는 ORDINAL, STRING이 있다.
ORDINAL: 디폴트 설정이며 컬럼이 숫자로 들어감(USER:1, ADMIN:2)
STRING: 컬럼이 숫자가 아니라 String 그대로 들어감(USER:"USER", ADMIN:"ADMIN")

 

@NonNull

Null을 허용하지 않는다고 선언한다.

 

@NotEmpty(message="회원 이름은 필수입니다")

이게 선언된 필드는 반드시 값이 비어있지 않아야 한다. 비어있으면 오류가 발생한다.

 

@ModelAttribute("data")

model.addAttribute("data", data) << 이 코드가 자동으로 세팅되기 때문에 생략이 가능하다.

 

@JsonIgnore

클라이언트에 반환할 때 반환하고싶지 않은 멤버변수에 선언한다. 실무에선 dto로 클라이언트에 반환할 것을 따로 정리하기 때문에 잘 쓰지 않는다.

 

@EqualsAndHashCode(of = "orderId")

응답 데이터가 같을 경우 하나만 반환해준다. 데이터가 같다는 기준점을 of 속성을 통해 정해줘야 한다.

 

@ToString(of = {"id", "username", "age"})

System.out.print로 객체를 찍을때 of 속성에 넣어준 키값이 바로 출력된다. 하나하나 getId, getUsername 이런식으로 찍지 않아도 된다.

 
@UniqueConstraint
@Table에서 쓸 수 있는 속성 중 uniqueConstraints가 있는데 두개 이상의 컬럼을 unique로 설정하는 방법이다.

 

@ColumnDefault

@Qualifier
어떤 service의 구현체를 쓸지 선택