ssung_항해일지/항해99_Spring_입문, 숙련, 심화

spring - 6일차

ssungcohol 2023. 2. 9. 01:42

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