Sping Annotation

박세건·2023년 3월 25일
0

@NoArgsConstructor

파라미터가 없는 기본 생성자를 생성

@AllArgsConstructor

모든 필드값을 파라미터로 받는 생성자를 생성

@RequiredArgsConstructor

final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 생성

@Entity

이 어노테이션이 적용된 클래스는 JPA가 관리한다
DB의 테이블과 Class와 맵핑한다면 필요

@Table

맵핑할 테이블 지정

@Column

객체필드와 DB 테이블의 컬럼을 맵핑

@Id

기본키가될 객체

@GeneratedValue

기본키값에 대한 생성 전략 제공

@PathVariable

URI값에 가변형 변수를 전달해서 처리하는 방식인 REST API
이때, uri에 사용된 값을 가져오는 역할을 한다 @GetMapping({x}) x 와 동일한 이름을 갖는 파라미터를 추가한다
예시) 주소의 boardId를 파라미터로 받아오기위해서 사용

@PostMapping("/api/board/{boardId}/reply")
    public ResponseDto<Integer> replySave(@RequestBody Reply reply, @PathVariable int boardId, @AuthenticationPrincipal PrincipalDetail principalDetail) {
        boardService.댓글쓰기(board,principalDetail.getUser());
        return new ResponseDto<Integer>(HttpStatus.OK.value(),1);
    }

@MappedSuperclass

상속 관계 매핑 전략에서 부모 클래스와 자식 클래스 모두 데이터베이스 테이블과 매핑 한다. 이와 달리, 부모 클래스를 상속받는 자식클래스들에게 매핑 정보만 제공하고싶을때
이 어노테이션을 사용한다.
엔티티 종류에 상관없이 공통으로 가지고 있어야하는 정보(생성시간, 수정시간 등) 가 있다면 공통 클래스로 추출하고 이를 상속받는 방식으로 구현할 때 사용한다. 따라서 엔티티가 아닌 클래스를 상속 받기 위해서 이 어노테이션을 사용한다.

@EntityListener

Entity가 가입, 삭제, 수정, 조회 등의 작업을 할 때 전, 후에 어떠한 작업을 하깅위해서 이벤트 처리를 위한 어노테이션
속성값으로(AuditingEntityListener.class) 를 사용하면 시간에 대해서 자동으로 값을 넣어줌

@EnableJpaAuditing

auditing기능을 사용하기위해서 springboot main에 추가해줘야하는 어노테이션

@CreationTimestamp, @UpdateTimestamp

INSERT, UPDATE 등의 쿼리가 발생할 때, 현재 시간을 자동으로 저장해줌

@Column의 속성

insertable=false는 insert 시점에 막는 것이고, updatable는 update 시점에 막는 기능입니다.

@ManyToOne, @OneToMany

Member 입장에선 Team과 다대일 관계이므로 @ManyToOne이 됩니다.
연관관계를 매핑할 때 이렇게 다중성을 나타내는 어노테이션은 필수로 사용해야 하며,
엔티티 자신을 기준으로 다중성을 생각해야 합니다.
(@ManyToOne(fetch=FetchType.Eager) , 즉시로딩(EAGER)과 지연로딩(LAZY)는 다음글에서 설명한다)
(참고로 @ManyToOne 매핑의 기본 fetch가 EAGER라서 생략해도 EAGER로 동작한다.)

@Transactional

트랜잭션이 필요한 서비스 클래스 또는 메서드에 달아준다
이 어노테이션이 붙으면 우선 적용된다, 이 어노테이션이 붙은 메서드가 포함하고 있는 작업중에하나라도 실패하는 경우에는 작업을 취소한다.
SQL문으로 update,delete,create 할때 메소드 위에 붙여주자

@Query

SQL과 유사한JPQL(Java Persistence Query Language) 라는 객체지향 쿼리 언어를 통해 복잡한 쿼리 처리를 지원해준다
ex) @Query(value = "update BoardEntity b set b.boardHits=b.boardHits+1 where b.id=:id")
(boardEntity 테이블에 boardHits 라는 컬럼이 있다)
속성 = navtivQuery=true 를 사용해서 기존의 SQL문을 사용할 수 있도록 한다

@Param

@Query(value = "update BoardEntity b set b.boardHits=b.boardHits+1 where b.id=:id")
void updateHits(@Param("id") Long id);
@Query를 통해서 사용했던 변수명으로 사용할 값을 지정해준다.

@Modifying

@Query 어노테이션을 통해 작성된 insert,update,delete(select는 제외) 쿼리에서 사용되는 어노테이션
사용하지 않는다면 에러가 발생하고 공식문서에서 DML 문을 싱핼할 경우 반드시 @Modifying을 붙이라고 강제한다.

@PageableDefault

속성으로 size,sort,direction을 지정해준다.
page : 조회할 페이지의 번호입니다. 0번부터 시작
size : 한 페이지에 노출할 데이터 건수를 지정
sort : 정렬 조건을 정의
/paging?page=1 로 입력을 받아와야하지만
@PageableDefault(page=1) 하게되면 입력이 /paging 만있어도
/paging?page=1 로 받아온것처럼 진행된다

@RequestParam

ex) /member?name="value" 위에 url을 입력하면 이름이 value인 회원의 정보를 알려준다고 할때

@GetMapping("/member")
    public String findByName(@RequestParam String name) {
        
    }

name에 해당하는 "value" 가 findByName() 함수에 name 으로 전달되어 저장된다
이렇게 @RequestParam의 경우 url뒤에 붙는 파라미터의 값을 가져올 때 사용합니다.

  • (@RequestParam(value = "login" ,required = false) 속성값으로 required가 있는데 default값은 true 이고 login이 존재해야만 컨트롤러가 작동하고 false이면 login 값이 존재하지않아도 들어가는것을 의미한다

@Autowired

의존관계주입을 위한 어노테이션
Bean에 저장되어있는 오브젝트를 꺼내서 주입시켜준다
ex)userRepsitory를 UserService에서 사용할 수 있게 주입한다

public class UserService {
  @Autowired
  private UserRepository userRepository;

@Builder

이 어노테이션이 붙은 클래스는 빌더패턴이 사용가능하다
ex) 빌더패턴 - .속성(속성값) 대입

User kakaoUser = User.builder()
                .username(kakaoProfile.getKakaoAccount().getEmail() + "_" + kakaoProfile.getId())
                .password(cosKey)
                .email(kakaoProfile.getKakaoAccount().getEmail())
                .oauth("kakao")
                .build();

@OrderBy

@OrderBy("id desc")
private List<Reply> replyList;

가 있고 replyList 정보를 가져올때 정렬된 상태로 가져오기위해서 정렬 조건과 정렬 방법을 써준다
ex) @OrderBy("id desc") //replyList를 가져올때 내림차순으로 정렬해서 가져온다

@JsonIgnoreProperties

@JsonIgnoreProperties({"board"})
private List<Reply> replyList;

어떠한 클래스의 속성에 List 라는 개체가있고 이 Reply 정보를 가져올때에
Reply의 board 속성은 가져오지 않도록 설정하는것이다
이는 무한 참조를 방지하기위해서 사용되곤 한다
ex) board가 reply를 갖고있고 reply도 board를 갖고있다면
board에서 reply를 갖고오지만 갖고온 reply에서는 board를 가져오지않는다는 설정

@RequestBody, @ResponseBody

Spring에서는 @RequestBody, @ResponseBody 어노테이션을 명시함으로써 MessageConverter를 통한 데이터 변환 과정을 거치게 되는데요.
클라이언트에서 서버에 JSON 형식의 requestBody로 요청 데이터를 전송했을 때, Java에서는 해당 JSON 형식의 데이터를 받기 위해서 JSON -> Java Object로의 변환이 필요합니다.
마찬가지로 요청된 데이터를 처리 후, 서버에서 클라이언트로 다시 응답 데이터 responseBody를 보낼 때도 Java Object에서 JSON 또는 XML 같은 형식으로의 변환이 필요합니다. 이러한 과정을 해당 어노테이션들이 처리해주는 것입니다.
(RequestMappingHandlerAdapter에는 요청 또는 응답의 데이터 형식에 따른 여러 개의 메시지 변환기 HttpMessageConverter가 등록되어 있습니다.)
@RequestBody = JSON -> JAVA Object
@ResponseBody = JAVA Object -> json 기반의 HTTP Body

@ModelAttribute

@RequestParam과 비슷하지만 @ModelAttribute의 눈에 띄는 차이점은, 1:1 매핑이냐, 객체 매핑이냐 인것이다.
즉, 객체를 매핑한다.

@Lob

일반적으로 엔티티 객체를 DB에 Column 으로 만들어줄 때에는

	@Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;
  @Column(nullable = false,length=100)
  private String title;

이렇게 @Column을 지정해줘서 속성을 정해준다 하지만 여기서 일반적인 데이터베이스에서 저장하는 길이인 255개 이상의 문자를 저장하고 싶을 때 @Lob을 지정한다.

profile
멋있는 사람 - 일단 하자

0개의 댓글