ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ☑️[SPRING] 어노테이션 모음
    Spring Boot 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의 구현체를 쓸지 선택
Designed by Tistory.