Annotation
- 자바 소스코드에 추가하여 사용할 수 있는 메타데이터의 일종
- 클래스와 메서드에 추가하여 다양한 기능을 부여
- Annotation 사용으로 코드량이 감소하고 유지보수가 쉬우며 생산성이 증가한다.
Annotation 정리
종류 | 기능 |
@Controller | spring 에게 해당 class가 controller의 역할을 한다고 명시 |
@RestController | @Controller에 @ResponseBody가 추가된 것으로, Json 형태로 객체 데이터를 반환 (최근, 데이터 응답으로 제공하는 REST API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환) |
@RequiredArgsConstructor | 초기화 되지 않은 final 필드나, @NonNull이 붙은 필드에 대하여 생성자를 생성 |
@AllArgsConstructor | class의 모든 필드 값을 파라미터로 받는 생성자를 추가 |
@NoArgsConstructor | class의 기본생성자를 자동으로 추가 |
@GetMapping | HTTP GET 요청을 처리하는 메서드를 맵핑하며, 데이터를 가져올 때 사용 |
@PostMapping | HTTP POST 요청을 처리하는 메서드를 맵핑, 데이터를 게시할 때 사용 |
@PutMapping | HTTP PUT 요청을 처리하는 메서드를 맵핑, 데이터를 수정할 때 사용 (데이터 전체를 갱신할 때 사용) |
@DeleteMapping | HTTP DELETE 요청을 처리하는 메서드를 맵핑, 데이터를 삭제할 때 사용 |
@PatchMapping | HTTP PATCH 요청을 처리하는 메서드를 맵핑, 데이터를 수정할 때 사용 (수정하는 영역만 갱신) |
@Service | spring 에게 해당 class가 service의 역할을 한다고 명시 |
@Transactional | 데이터 추가, 갱신, 삭제 등으로 이루어진 작업을 처리하던 중 오류 발생 시 모든 작업들을 원상태로 되돌릴 수 있음 |
@Transactional(readOnly = true) | 읽기 전용으로 설정 |
@Getter | class 모든 필드의 Getter method를 생성 |
@Setter | class 모든 필드의 Setter method를 생성 |
@Entity | spring 에게 해당 class가 Entity의 역할을 한다고 명시 |
@Id | Entity 클래스에 PK(Primary Key)를 지정해줌 |
@GeneratedValue | 기본키(PK) 값에 대한 생성전략을 제공, @Id와 함께 Entity 또는 매핑된 슈퍼클래스의 기본 키 속성 또는 핑드에 적용할 수 있다. |
@MappedSuperclass | 객체의 입장에서 공통 매칭 정보가 필요할 때 사용한다 공통 매핑 정보가 필요할 때, 부모 클래스에 선언하고 속성만 상속받아서 사용하고 싶을 때 @MappedSuperclass를 사용한다 |
@EntityListener(AuditingEntityListener.) | JPA Entity에서 이벤트가 발생할 때마다 특정 로직을 실행시킬 수 있는 어노테이션 Entity가 삽입, 삭제, 수정, 조회 등의 작업을 할 때 전, 후에 어떠한 작업을 하기 위해 이벤트 처리를 위한 어노테이션이다 |
@CreatedDate | Entity가 생성되서 저장될 때 시간이 자동으로 저장 |
@LastModifiedDate | 조회한 Entity의 값을 변경할 때 시간이 자동으로 저장 |
@EnableJpaAuditing | Main method가 있는 클래스에 적용, JPA Auditing(감시, 감사) 기능을 활성화 createdDate, modifiedDate 처럼 DB에 데이터가 저장, 수정 될 때 누가, 언제 했는지를 자동을 관리 할 수 있음 |
Getter, Setter 를 사용하는 이유는??
- 데이터 무결성을 위해 사용한다 (데이터의 정확성, 일관성을 유지보증)
- 데이터의 유효성 검사 & 무결성 검사 가능 => 데이터의 은닉화
but!
Setter는 데이터 무결성을 해칠 가능성이 있다. 이때, builder를 사용하는데 builder는 복잡한 객체 생성클래스와 표현 클래스를 분리해준다. (필수값 = 생성자, 선택값 = 메소드)
이에 따라, 필요데이터 설정, 유연성, 가독성, 불변성을 확보할 수 있는 이점이 있다.
@GeneratiedValue - 기본키 자동생성(DB가 자동할당)
- IDENTITY - 기본키 생성을 DB에 위임한다
(DB에 값을 저장 후 기본키 값을 구할 수 있다, 영속성 컨텍스트 저장을 위해 INSERT 바로 날림) - SEQUENCE - 테이터베이스 오브젝트 사용, 시퀀스를 사용하여 기본키 할당 (ORACLE 주로 사용)
(유일 값을 순서대로 생성) - TABLE - 별도의 키 테이블 생성 사용, 모든 DB 사용 가능
(DB테이블을 흉내내어 컬럼 생성 후 사용(Like sequence), 장점 : 모든 DB 사용가능, 단점 : 성능저하) - AUTO - DB 방언 종류에 따라 하버네이트가 자동 전략 위임
Transaction (더이상 쪼갤 수 없는 최소한의 작업 단위)
- 여러 작업을 진행하다 문제 발생 시 이전 상태로 rollback 하기 위해 사용
- 커밋 : 작업 마무리
- 롤백 : 작업 취소 후 이전상태
- 동기화 : 트랜젝션을 시작하기 위한 conection 객체를 특별 저장소에 저장 후 꺼내쓰는 기술
(하버네이트 = session 사용) - 추상화 : 공통점(기술)을 담은 기술로, 종속적인 코드를 사용 않고 일관된 트렌젝션 처리
- AOP를 사용한 분리 (보강 필요)
@Transactional
- 4가지 속성(ACID)
- 원자성 (Atomoicty) : 트렌젝션 내의 실행작업들은 하나의 단위로 처리, 모두 성공 or 모두 실패
- 일관성 (Consistency) : 일관성 있는 DB상태 유지
- 격리성 (Isolation) : 동시 실행되는 트랜젝션이 서로에게 영향이 없음
- 영속성 (Durability) : 트랜젝션이 성공적으로 수행 시 결과 저장
- 6가지의 옵션
- isolation : 일관성 없는 데이터 의 허용 주순 설정(격리수준)
- propagation : 동작 도중 다른 트랜젝션 호출 시, 어떻게 할 것 인지를 결정 (전파)
- noRollback : 특정 예외 발생 시 rollback 동작을 하지 않게 설정
- rollback : 특정 예외 발생 시 rollback 동작을 하도록 설정
- timeOut : 동작 시간 내 메소드를 수행하지 못할 시 rollback 설정 (시간 = 초단위)
- readOnly : 읽기 전용으로 설정 (Insert, Update, Delete 예외 발생)
@ ----Constructor
- AllArgsConstructor : 모든 것을 파라미터로 받는 생성자
Restaurant (Chef, int, String)
private Chef chef;
private Int int;
private String string;
- RequiredArgsConstructor : 여러개의 인스턴스 변수 중 특정변수에 대해서만 생성자를 생성하고자 할 때 사용
(@Nonnull, final 에 대해서만) - NoArgsConstructor : 파라미터가 없는 기본 생성자 생성
게시글 목록 조회 <List>
- Controller
@GetMapping("/notices")
public List<NoticeResponseDto> getNotice() {
return noticeService.getNotice();
}
- Service
private final NoticeRepository noticeRepository; // 그릇 만들어주기
public List<NoticeResponseDto> get notice() {
List <Notice> noticeList = noticeRepository.findAllByOrderModifiedAtDesc();
List <NoticeResponseDto> noticeReponseDtoList = new ArryList<>();
for (Notice notice : noticeList) {
NoticeResponseDto tmp = new NoticeResponseDto(notice);
noticeResponseDtoList.add(tmp);
}
retuen noticeResponseDtoList;
}
- NoticeResponseDto
@Getter
public class NoticeReponseDto {
private Long id;
private String username;
private String title;
private String Contents;
private LocalDateTime createdat;
private LocalDatetime modifiedat;
public NoticeResponseDto(Notice notice) {
this.id = notice.getId();
this.title = notice.getTitle();
this.contents = noitce.getContents();
this.createdat = noitce.getCreatedat();
this.modifiedat = notice.getModifiedat();
}
}
728x90
'ssung_항해일지 > 항해99_Spring_입문, 숙련, 심화' 카테고리의 다른 글
spring - 8일차 (0) | 2023.02.11 |
---|---|
spring - 7일차 (JPA) (0) | 2023.02.10 |
spring - 5일차 (0) | 2023.02.08 |
spring - 4일차 (메모장 만들기) (0) | 2023.02.07 |
Spring - 2일차 (0) | 2023.02.05 |