[Spring#46] 주특기 플러스 주차 - ORM 장단점, Raw JPA / 알고리즘 : H-Index

김한준 Hanjun Kim·2023년 12월 13일
1

내일배움캠프

목록 보기
47/70

주특기 플러스 주차

강의를 들으니 이질감이 든다.
~ 해줘야 해요. 왜?
왜라는 생각이 드는데 거기에 대해 이유를 설명해 주지 않는다.
결국 따로 찾아보게 된다.


이번 강의는 따라서 만드는것은 GitHub에서 Clone으로 가져오고,
강의 들으면서 내용을 정리하는것은 들으면서 궁금한 점을 메모 해 놓았다가 
따로 공부해서 TIL을 쓰려고 한다.

오늘 들으면서 도메인과 엔티티에 대해 궁금증이 들어서 중간에 검색을 해 보았는데, 
하나하나 개념적으로 접근 해 가며 공부하는것이 좋을 것 같다.
원빈튜터님한테 여쭤본것들을 정리 해 보았다.
면접이나 이후 방향성에대해 알려주신것 같다
하지만.. 지금 내게 필요한것은 이게아니라 연관관계에 대한것인데

> 예외 전환

exchange : 예외 전환
이전에 어떤 예외때문에 발생했는지 알 수 있음
checked exception을 custom exception으로 바꿀 때

예외전환할때는 throwable 해서 해야한다

--------------------

> 이력서

예) 내가 회사에서 배치시스템을 짰다.
라고 한줄만 써놓는다 -> 어쩌라고?
명확하게 스프링 몇버전, 스프링 배치를 썼고, 배치에서 어떻게 벌킹을 썼고 등등 이런걸 써야함

포트폴리오를 pdf로 만들게 될텐데 노션 링크를 쓴다? -> 클릭하기 싫어짐

한마디로 입구부터 어그로를 끌 수 있게 작성해야 한다.
Readme 든 포트폴리오든..

--------------------

> 취업전략

가고싶은 도메인을 선택해서 거기에 적합한 프로젝트를 만들어라.

핀테크를 가든 어커머스를 가든 iot를 가든 

거기에서 사용하는 이해도는 다 똑같은데

차별성을 줘야 하니까 

그 도메인에서 원하는 이해도를 노려서 준비 하라

거기에 해당하는 스터디를 하는 방법도 있고

--------------------

CRCD 젠킨스 웹훅 파이프라인에 대한 이해
도커까지만

1주차 3강

ORM의 성장 과정

  • 관계설정을 객체(RDB 사용)로 매핑하는 이유

  • ORM이 해결해야하는 문제점과 해결책

    • 상속 문제 : 테이블들은 상속관계가 없고 모두 독립적으로 존재한다.
      -> 매핑정보에 상속정보를 넣어준다.(연관관계 설정, @OneToMany, @ManyToOne)

    • 관계 문제 : 외래키를 설정하여 Join으로 조회시에만 참조가 가능하다.
      -> 매핑정보에 방향정보를 넣어준다.(@JoinColumn, @MappedBy)

    • 탐색 문제 : 탐색시 참조하는 만큰 추가 쿼리나, Join 이 발생하여 비효율적이다.
      -> 매핑/조회 정보로 참조탐색 시점을 관리한다(@FetchType, fetchJoin())

    • 밀도 문제 : 기본 데이터 타입만 존재한다.
      -> 크기가 큰 멤버 객체는 테이블을 분리하여 상속으로 처리한다.(@embedded)

    • 식별성 문제 : PK로만 식별
      -> PK를 객체 Id로 설정하고 EntityManager는 해당 값으로 객체를 식별하여 관리한다.(@Id, @GeneratedValue)

  • 대신 ORM이 얻은 장점

    • 캐싱 기능(1차, 2차 캐시)

      • 1차 캐시 : 영속성 컨텍스트 내부에는 엔티티를 보관하는 저장소가 있는데, 이를 1차 캐시라고 한다.

      • 트랜잭션을 시작하고 종료할 때까지만 1차 캐시가 유효하다.

        • 1차 캐시는 한트랙잭션 계속해서 <원본> 객체를 넘겨준다.
      • 2차 캐시 : 어플리케이션 범위의 캐시, 1차와 달리 객체 원본을 넘겨주지 않고 <복사본> 을 만들어서 넘겨준다.

      • 복사본을 넘겨주면 문제가 생길까봐

        • 어플리케이션이 종료할 때 까지 2차 캐시가 유지된다.
    • 영속성 컨텍스트(1차 캐시)를 활용한 쓰기지연

      • 영속성? : 데이터를 생성한 프로그램이 종료되어도 사라지지 않는 데이터의 특성.

      • 그래서 우리는 데이터를 파일이나 DB에 영구 저장함으로써 데이터에 영속성을 부여함.

      • 영속성의 4가지 상태
        - 비영속 > 영속 > 준영속 | 삭제

        • persist(), merge() - 영속성 컨텍스트에 저장된 상태(Managed) > flush() - DB에 쿼리가 전송된 상태 > 트랜잭션 종료 - commit() > DB에 쿼리가 반영된 상태
      • 쓰기 지연 : 여러가지 동작이 많이 발생하더라도 flush() 하기 전엔 쿼리가 날아가지 않게 함으로써 최소한의 쿼리만 날라가게 함

        • 예) flush()를 주석처리 한다면, 아래의 메소드는 insert 쿼리가 날라가지 않기 때문에 값을 뱉어내지 않는게 맞지만...
          -> 쓰기 지연이 발생하더라도 <영속성 컨텍스트> 에서 조회 해 온다.
Team teamA = new Team();
teamA.setName("TeamA");
em.persist(teamA);

Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);

Member member_A = new Member();
member_A.setName("memberA");
member_A.setTeam(teamA);

em.persist(member_A);

// em.flush();

Member findMember = em.find(Member.class, member_A.getId());
Team findTeam= findMember.getTeam();

System.out.println(findTeam.getName());
      

1주차 4강

Raw JPA로 개발하기

  • 도메인 모델과 테이블 설계

    • Domain(도메인) : 특정 주제나 영역을 나타냅니다.
      • 예를 들어, 은행 업계의 도메인은 금융 서비스, 계좌 관리, 거래 등을 포함할 수 있습니다.
        의료 분야의 도메인은 환자 정보, 의료 기록, 진료 등을 다룹니다.
  • Entity(엔티티) : 엔티티는 도메인 내에서 식별 가능한 개별적인 요소나 객체를 나타냅니다.
    이는 데이터 모델링에서 특정 유형의 정보를 표현하는 데 사용됩니다.

    • identifier(식별자)로 구분된다.
      • 예를 들어, 은행 도메인에서 "고객", "계좌", "거래"는 각각 엔티티가 될 수 있습니다.
        의료 도메인에서는 "환자", "의사", "진료 기록" 등이 엔티티가 될 수 있습니다.
  • Raw(날것의) JPA 테이블 매핑 기능

    • @Entity : 객체 관점에서의 이름

      • 티폴트로 클래스명으로 설정됨.
      • 엔티티의 이름은 JQL에서 쓰임
    • @Table : RDB의 테이블 이름

      • @Entity의 이름이 테이블의 기본값.
    • 테이블의 이름은 SQL에서 쓰임

  • 라이브템플릿 : sout같은거
    - Setting - Editor - Live Template

    알고리즘

    깃허브 링크 :https://github.com/wkdehf217/codingTest/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/2/42747.%E2%80%85H%EF%BC%8DIndex

    이번 문제는 이해가 안가서 질문하기 탭에 들어 가 보았는데

    문제가 이상하다는 말이 많았다.

    그도 그럴게 푸는 사람 대다수가 이해가 안가면 이게 좋은 문제는 아닌것같다.

    내가 풀었다고, 풀 수 있다고 생각이 들지 않아서 깃허브 링크만 올려놓는다.

profile
개발이 하고싶은 개발지망생

0개의 댓글