2023.06.23.금.TIL

heeh·2023년 6월 23일

TIL

목록 보기
28/82
post-thumbnail

Spring 숙련

  • Dmain - 쿠키가 저장된 Domain
    → 여러 경로에 나눠서 쿠키가 저장될 수 있다
  • Path - 경로
    → 로컬 Domain Local/API 식으로 구분
  • Expires - 만료 기한
    → 만료 기한이 지나면 삭제
  • Sizs, HttpOnly, Secure 등등

2주차 숙제 JPA

  • 2-12 참고하여 PostService → PostRepository 옮기기

    • findById
    • Transactional 환경 등 확인
  • return postRepository.findAll().stream().map(PostResponseDto::new).toList();

    • postRepository.findAll() : postRepository의 findAll()(모든 것)을
    • .stream() : 돌려서 하나씩 빠져나가며
    • .map(PostResponseDto::new) : map(mapping 하나씩 매핑)에 의해 변환되고 PostResponseDto::new PostResponseDto의 생성자 중에서 Post를 파라미터로 가지고 있는 생성자가 호출이 되고 하나씩 변환 되면서
    • .toList(); : 그 것들을 List 타입으로 바꿔줌
  • postRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("선택한 게시글은 존재하지 않습니다"));

    • .orElseThrow(); 를 사용하면 간편하게 처리할 수 있음
      → 뭘 간편하게 처리하나요…ㅜㅜ 검색해보기
  • IllegalArgumentException
    → 검색해보기

  • Optional 타입으로 받아야 하는데 한번에 Post로 뽑기 위해 쓰인 것!?
    → Optional에 .orElseThrow를 부르면 post가 null 값이 아니라면 null을 체크
    → findById 했는데 아무것도 없다면(데이터베이스에 아무것도 없다면) null 반환
    → null이 되면 Throw를 함 (new IllegalArgumentException으로 정의해준 “ “ 값을 출력)

  • Optional 추가 공부 필요

  • update
    - 영속성 컨텍스트 유지를 위해
    - 변경감지를 위해 트랜잭셔널 어노테이션을 걸어줘야 함
    - SimpleJpaRepository에서 findById의 @오버라이딩 확인(가장 상단에 트랜잭셔널이 걸려 있음) → Service의 update에도 @트랜잭셔널 걸어줘야 함
    - 부모 메서드에 트랜잭셔널 확인 (없으면 걸어야 한다…?!)
    → 트랜잭션 전파! (영속성 컨텍스트 유지와 변경 감지 이루어지기 위해)

    // JPA 구현체인 hibernate
    implementation 'org.hibernate:hibernate-core:6.1.7.Final'
    // MySQL
    implementation 'mysql:mysql-connector-java:8.0.28'
  • @GeneratedValue(strategy = GenerationType.IDENTITY) 알아보기…

  • @Column(name = "title", nullable = false, unique = false);, @GeneratedValue(strategy = GenerationType.IDENTITY); 같은 어노테이션이 왜 빨간색 줄이 뜰까!?! 답답해!

    • 어노테이션은 ; (세미콜론)을 붙이면 안됩니다…
  • @Id와 @GeneratedValue의 위치는?

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
  • implements : 인터페이스와 클래스 간에 사용

  • extends(상속) : 인터페이스와 인터페이스, 클래스와 클래스 간에 사용

  • implements와 extends의 다른점 찾아보기

  • 왜 Entity를 직접 return하지 않나요?! & 왜 Entity가 아닌 Dto로 반환 해야하나요?

    • Entity를 직접 반환하면 보안의 위험성이 있음, ResponseDto로 변환하여 반환하면 정보를 선택하여 반환 가능(보안을 지킬 수 있다!)
  • abstract??

    • Abstract 클래스
      • "abstract" 키워드로 선언된 클래스는 추상 클래스(abstract class)
      • 추상 클래스는 직접적으로 인스턴스화할 수 없으며, 다른 클래스에서 상속받아 사용
    • Abstract 메서드
      • "abstract" 키워드로 선언된 메서드는 추상 메서드(abstract method)

Timestamped (JPA Auditing 기능)추가

  • @EntityListeners(AuditingEntityListener.class)
    • 자동으로 시간에 넣어 주는 기능이 수행
  • JPA Auditing 기능 → Spring Boot에 알려주기
    • Main 메서드가 있고, SpringBooApplication Annotation이 있는 클래스에 @EnableJpaAuditing 입력
    • Timestamped Class를 Post(Entity) Class에 상속해주기
      public class Post extends Timestamped
  • PostResponseDto에 Timestamped의 필드명 넣어주기
    → LocalDateTime 객체의 인스턴스
    - private LocalDateTime createdAt;
    - private LocalDateTime modifiedAt;

비밀번호가 일치하면 수정, 삭제 기능 이루어지기

  • requestDto.getPassword().equals(post.getPassword())
  • RequestDto의 비밀번호와 post(DB)의 비밀번호가 맞는지 확인하기!!!
profile
공부하자개발하자으쌰으쌰

0개의 댓글