-
Annotation 정리Spring/Spring Boot Project 2022. 8. 8. 16:17
@Controller
📎 보통 View를 반환하기 위해 사용
📎 Data를 반환해야 하는 경우도 있음 => @ResponseBody 활용해야 함
📎 Controller를 통해 객체를 반환할 때는 일반적으로 ResponseEntity로 감싸서 반환함
@RestController
📎 @Controller + @ResponseBody
📎 주 용도는 Json 형태로 객체 데이터를 반환하기 위함
@Autowired
📎 자동으로 의존관계 주입
📎 생성자에 @Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입
@RequiredArgsConstructor
final 키워드를 사용한 인스턴스만 Bean 객체로 등록함!!
의존성 자동 주입
@Service @RequiredArgsConstructor public class GuestbookServiceImpl implements GuestbookService { private final GuestbookRepository repository; ``` }
@GetMapping
📎 브라우저의 주소창에서 호출 가능하도록 함
@GetMapping("/hello") // -> http://localhost:8080/hello 호출
@GetMapping({"/ex2"})
value를 {}로 처리하면 하나 이상의 URL을 지정할 수 있음
@ModelAttribute
📎 메소드의 파라미터로 사용할 경우
사용자가 전달하는 값을 객체 형태로 매핑해줌 (값 전달을 위해 주로 사용)
- @ModelAttribute가 붙은 객체 자동 생성. (@ModelAttribute가 지정하는 클래스는 빈 클래스여야 함)
- 생성된 객체 HTTP로 넘어 온 값들을 자동 바인딩
- @ModelAttribute가 붙은 객체가 자동으로 Model객체에 추가되고, View단으로 전달됨
@PathVariable
📎URI에 변수가 들어갈 때 사용
Ex) https://spi/location/cafes/12
사용 예:
@GetMapping("/location/cafes/{id}") public CafeResponseDto findById (@PathVariable Long id) { return cafeService.findById(id); }
@Entity
해당 클래스가 엔티티를 위한 클래스이며,
해당 클래스의 인스턴스들이 JPA로 관리되는 엔티티 객체라는 것을 의미
@Table
@Entity와 같이 사용할 수 있는 어노테이션
데이터베이스상에서 엔티티 클래스를 어떠한 테이블로 생성할 것인지에 대한 정보를 담기 위한 어노테이션
@Table(name = "tbl_memo") // 예시
@Inheritence
- JOINED, SINGLE_TABLE, TABLE_PER_CLASS의 종류가 있음
@Inheritence(strategy = InheritanceType.SINGLE_TABLE)
- @Inheritence의 default 전략
- Single table 전략: 모든 자식 엔티티가 부모 엔티티와 함께 하나의 테이블에 저장
- @DiscriminatorColumn 필수
@Transactional
해당 메서드를 하나의 '트랜잭션'으로 처리하라는 의미
속성에 따라 다르게 동작하지만, 기본적으로는 필요할 때 다시 데이터베이스와 연결이 생성됨
* 테스트 코드에 있으면, 테스트가 끝나고 데이터를 롤백하기 때문에 데이터베이스를 확인해도 해당 데이터는 없음
👉 만약, 데이터를 눈으로 확인하고 싶으면, @Rollback(false)를 하면 됨
@Id
@Entity가 붙은 클래스는 Primary Key에 해당하는 특정 필드를 @Id로 지정해야만 함
@Id가 사용자가 입력하는 값을 사용하는 경우가 아니면 자동으로 생성되는 번호를 사용하기 위해 @GeneratedValue 사용
@GeneratedValue
@GeneratedValue(strategy = GenerationType.IDENTITY)
위 코드는 Primary Key를 자동으로 생성하고자 할 때 사용함 (= 키 생성 전략)
오라클: 별도의 번호를 위한 별도의 테이블 생성
MySQL, MariaDB: auto increment를 기본으로 사용해서 새로운 레코드가 기록될 때 마다 다른 번호를 가질 수 있도록 처리
키 생성 전략
• AUTO(default): JPA구현체(스프링 부트 - Hibernate)가 생성 방식을 결정
• IDENTITY: 사용하는 데이터베이스가 키 생성을 결정 MySQL이나 MariaDB는 auto increment방식 사용
• SEQUENCE: 데이터베이스의 sequence를 이용해서 키를 생성. @SequenceGenerator와 같이 사용
• TABLE: 키 생성 전용 테이블을 생성해서 키 생성. @TableGenerator와 함께 사용
@Column
추가적인 필드(column)가 필요한 경우 사용
nullable, name, length 등을 사용해서 데이터베이스의 column에 필요한 정보 제공
@Column(columnDefinition = "TEXT")
@JoinColumn
외래 키를 매핑할 때 사용
name 속성: 매핑할 외래 키 이름을 지정
@Getter
Getter 메서드 생성
@Builder
객체 생성
객체 생성 후 setter를 통한 접근 제한 가능 => 불변형 객체 만들기 가능
@Builder를 이용하기 위해서는 @AllArgsConstructor와 @NoArgsConstructor를 항상 같이 처리해야 컴파일 에러가 발생하지 않음
import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/sample") @Log4j2 public class SampleController { @GetMapping("/ex1") public void ex1() { log.info("ex1............."); } }
@Builder(toBuilder = true)
builder 패턴으로 생성된 객체의 일부 값을 변경한 새로운 객체를 생성
@PersistenceContext
EntityManager를 빈으로 주입할 때 사용하는 어노테이션
- 스프링에서는 영속성 관리를 위해 EntityManager가 존재
- 스프링 컨테이너가 시작될 때 EntityManager를 만들어서 빈으로 등록해줌
- 이때 스프링이 만들어둔 EntityManager를 주입받을 때 사용
@Repository public class MemberRepository { @PersistenceContext private EntityManager em; public Long save(Member member) { em.persist(member); //새로운 entity를 영속성 콘텍스트 내에서 관리하고 싶을 때 사용 return member.getId(); } public Member find(Long id) { return em.find(Member.class, id); //영속성 콘텍스트에서 찾기 } }
persist는 GeneratedValue 전략에서는 기본적으로 DB에 insert문이 안 나감 (commit하면 그때 나감)
👉 test 코드에서 @Transactional을 사용하면, commit을 안 하고(정확히는 영속성 컨텍스트가 flush를 안 한거) Rollback을 하기 때문에 영속성 컨텍스트가 flush를 안 해서 insert문을 볼 수 없음
@RequestMapping
보통 특정 uri로 요청을 보내면 Controller에서 어떠한 방식으로 처리할지 정의함
이때 들어온 요청을 특정 메서드와 매핑하기 위해 사용하는 어노테이션
가장 많이 사용하는 것은 value와 method임
@RequestMapping(value = "/sample", method = RequestMethod.GET)
method도 같이 설정하려면 " value = " 는 생략 불가
[Spring] @RequestMapping이란? (tistory.com) <- 참고
@Log4j2
동작 확인 목적
Lombok의 기능.
@Data
Getter/Setter, toString(), equals(), hashCode() 를 자동으로 생성함
@MappedSuperClass
전체 엔티티에서 공통으로 적용하는 시간 관련(등록, 수정) 정보에 사용
이 어노테이션이 적용된 클래스는 테이블로 생성되지 않음
단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
실제 테이블은 해당 클래스를 상속한 엔티티의 클래스로 데이터베이스 테이블이 생성됨
부모 클래스를 상속 받은 자식 클래스에 매핑 정보만 제공
조회와 검색 불가 (find(BaseEntity) 불가)
@EntityListeners
JPA에서 사용하는 엔티티 객체들은 영속 콘텍스트라는 곳에서 관리하는 객체이고, 이 객체가 변경되면 데이터베이스에서 이를 반영하는 방식
따라서, JPA에서는 엔티티 객체가 유지되고, 필요할 때 꺼내서 재사용 하는 방식임
이때 엔티티 객체에 변화가 발생하는 것을 감지하는 리스너가 있음
@EntityListeners(value = {AuditingEntityListener.class})
JPA 내부에서 엔티티 객체가 생성/변경되는 것을 감지하는 역할은 AuditingEntityListener로 이루어짐
이를 통해 regDate, modDate에 적절한 값이 지정됨
(+ AuditingEntityListener를 활성화시키기 위해서는 main클래스에 @EnableJpaAuditing 을 추가해야 함
@CreatedDate
JPA에서 엔티티의 생성 시간 처리
@LastModifiedDate
최종 수정 시간을 자동으로 수정
@Modifying
📎 @Query 어노테이션을 통해 작성된 insert, update, delete 쿼리에서 사용되는 어노테이션
📎 기본적으로 JpaRepository에서 제공하는 쿼리 메서드나 메서드 네이밍으로 만들어진 쿼리 메서드에는 적용되지 않음
📎 주로 벌크 연산시에 사용됨
📍 벌크연산: 다건의 UPDATE, DELETE 연산을 하나의 쿼리로 하는 것
'Spring > Spring Boot Project' 카테고리의 다른 글
[Spring Boot] 지역별 카페 추천 프로젝트 (3) (0) 2022.09.06