-
☑️[SPRING] 어노테이션 모음Spring Boot 2022. 12. 6. 20:01더보기
@RestController
[Spring] @Controller와 @RestController 차이
@RequiredArgsConstructor
[Spring] @RequiredArgsConstructor 어노테이션을 사용한 "생성자 주입"
ModelAndView
[Spring] 컨트롤러, Model, ModelAndView 사용법
@RequestBody
[Spring] @RequestBody / @ResponseBody 어노테이션 이란?
@Entity
[JPA] 엔티티와 매핑. @Entity, @Table, @Id, @Column..
@Id
@Column(nullable = false)
[JPA] nullable = false와 @NotNull의 차이점
IllegalArgumentException 에러
런타임 에러 (IllegalArgumentException)
@MappedSuperclass
@MappedSuperclass
@EntityListeners
AuditingEntityListener
@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의 구현체를 쓸지 선택'Spring Boot' 카테고리의 다른 글
[SPRING] FK연결하지 말고 연관 테이블 객체 id만 쏙 빼오기 (0) 2022.12.22 [SPRING] java.lang.ClassNotFoundException: Could not load requested class : org.hibernate.dialect.MySQL5InnoDBDialect (0) 2022.12.19 [SPRING] 공백과 NULL 확인할땐 StringUtils.hasText() (0) 2022.12.14 [SPRING] DI(의존성 주입)가 무엇이고, IoC 컨테이너는 어떻게 사용할까? (0) 2022.12.12 ☑️[SPRING] 메모장 프로젝트 하면서 깨달은 애노테이션 (0) 2022.12.07