[인프런 워밍업 클럽 스터디] BE 스터디 1기 2주차 발자국

image

  • 섹션 4

    • SQl을 직접 작성하면 어떤 점이 아쉬울까?

      • 문자열을 작성하기 때문에 실수할 가능성 Up!

      • 실수를 인지하는 시점 Slow~

        • 컴파일 시점에 발견X, 런타임 시점 발견되기 때문에 오래걸림

           

      • 특정 데이터 베이스에 종속됨

      • 반복작업 多

      • 테이블 하나 만들 때마다 CRUP 쿼리가 항상 필요

      • 데이터베이스의 테이블과 객체는 패러다임이 다르다.

  • JPA ( Java Persistence API )

    • 객체와 관계형 DB의 테이블을 짝지어 데이터를 영구적으로 보관하기 위해 Java 진영에서 정해진 규칙

  • 영속성

    • 서버가 재시작되어도 데이터는 영구적으로 저장되는 속성

       

  • API

    • 정해진 규칙

       

  • ORM ( Object-Relational Mapping )

  • 객체-관계 매핑의 줄임말

     

    • 장점

      • 완벽한 객체지향적인 코드

      • 재사용, 유지보수, 리팩토링 용이성

      • DBMS(DataBase Management System) 종속성 하락

    • 단점

      • ORM이 모든 걸 해결X

      • 객체 - 관계 간의 불일치

        • 세분성 ( Granularity )

          • 경우에 따라서 DB에 있는 테이블 수보다 더 많은 클래스를 가진 모델이 생길 수 있음

        • 상속성 ( Inheritance )

          • RDBMS는 객체지향 프로그래밍 언어의 특징인 상속 개념이 X

        • 일치 ( Identity )

          • RDBMS는 기본키를 이용하여 동일성을 정의, 자바는 객체 식별( a==b )과 객체 동일성 ( a.equals(b))을 모두 정의한다.

        • 연관성 ( Associations )

          • 객체지향 언어는 방향성이 있는 객체의 참조( reference )를 사용하여 연관성을 나타내지만 RDBMS는 방향성이 없는 외래키를 이용해서 나타냄

        • 탐색 ( Navigation )

          • 자바와 RDBMS에서 객체를 접근하는 방법이 근본적으로 다르다. 자바는 그래프형태로 하나의 연결에서 다른 연결로 이동하며 탐색한다. 그러나 RDBMS에서는 일반적으로 SQL문을 최소화하고 JOIN 을 통해 여러 엔티티를 로드하고 원하는 대상 엔티티를 선택하는 방식으로 탐색

  • Hibernate란?

    • 하이버네이트는 자바 언어를 위한 ORM 프레임워크

    • JPA의 구현체로, JPA 인터페이스를 구현하며, 내부적으로 JDBC API를 사용

    • JPA는 관계형 데이터베이스와 객체의 패러다임 불일치 문제를 해결할 수 있다는 점과 영속성 컨텍스트(엔티티를 영구 저정하는 환경) 제공이 큰 특징

       

    • 장점

      • 생산성

         

        • Hibernate는 SQL을 직접 사용하지 않고, 메서드 호출만으로 쿼리가 수행 => SQL 반복작업을 하지 않음으로 생산성 UP!

        • SQL을 몰라도 되는 건 아님

      • 유지보수

        • 테이블 컬럼이 변경되었을 때, 테이블과 관련된 DAO 파라미터, 결과, SQL 등을 대신 수행 => 유지보수 UP!

           

      • 특정 벤더에 종속적이지 않음

        • JPA는 추상화된 데이터 접근 계층을 제공 => 특정 벤더에 종속적이지 않음

        • 설정 파일에서 JPA에게 어떤 DB를 사용하고 있는지를 알려주기만 하면 DB 변경 가능

      • 패러다임 불일치 해결

        • 상속, 연속 관계, 객체 그래프 탐색, 비교 등 객체와 관계형 데이터베이스와의 패러다임 불일치를 해결

           

    • 단점

      • 성능

        • 메서드 호출만으로 쿼리를 수행하는 것은 직접 SQL을 작성하는 것보다 성능상 좋지 않음

      • 세밀함

        • 메서드 호출만으로 DB 데이터를 조작하기에는 한계 有 => 보완하기 위해 JPQL을 지원

        • NativeQuery를 지원하여 SQL 자체 쿼리도 작성할 수 있음

      • 러닝커브

        • 공부할거 多

  • JPA 어노테이션

    • @Entity

      • 스프링이 User객체와 user 테이블을 같은 것으로 바라봄

    • @Id

      • 이 필드를 primary key로 간주함

    • @GeneratedValue

      • primary key는 자동 생성되는 값

      • MySQL의 auto_increment를 사용 = IDENTITY

    • @Column

      • 객체의 필드와 Table의 필드를 매핑

      • 생략도 가능

  • !! JPA를 사용하기 위해 기본 생성자 꼭 필요!!!

  • save => 주어지는 객체를 저장하거나 업데이트 시켜줌

  • findAll => 주어지는 객체가 매핑된 테이블의 모든 데이터를 가져옴

  • findById => id를 기준으로 특정한 1개의 데이터를 가져온다.

  • application.yml 세팅image

  • Spring Data JPA

    • 복잡한 JPA 코드를 스프링과 함께 쉽게 사용할 수 있도록 도와주는 라이브러리

  • By 앞에 들어갈 수 있는 구절 정리

    • find : 1건을 가져온다. 반환 타입은 객체가 될 수도 있고, Optional<타입>이 될 수도 있다.

    • findAll : 쿼리의 결과물이 N개인 경우 사용. List<타입> 반환

    • exists : 쿼리 결과가 존재하는지 확인. 반환 타입은 boolean

    • count : SQL의 결과 개수를 센다. 반환 타입은 long이다.

    • GreaterThan : 초과

    • GreaterThanEqual : 이상

    • LessThan : 미만

    • LessThanEqual : 이하

    • Between : 사이에

    • StartsWith : ~로 시작하는

    • EndWith : ~로 끝나는

  • 트랜잭션이란?

  • @Transactional

    • 쪼갤 수 없는 업무의 최소 단위

    • commit => 트랜잭션 성공!

    • rollback => 트랜잭션 실패ㅠ

  • ! 주의 사항 !

    • IOException과 같은 Checked Exception은 롤백이 일어나지 않는다.

  • 영속성 컨텍스트란?

    • 테이블과 매핑된 Entity 객체를 관리/ 보관하는 역할

    • => 스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.

    • 특수 능력 4가지

      // 영속성 컨텍스트의 특수 능력 4가지
      // 1 . 변경감지 (Dirty Check)
      // 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않더라도, 변경을 감지해 자동으로 저장된다.
      // 2. 쓰기 지연
      // DB의 INSERT / UPDATE / DELETE SQL을 바로 날리는 것이 아니라, 트랜잭션이 commit될 때 모아서 한 번만 날린다.
      // 3. 1차 캐싱
      // ID를 기준으로 Entity를 기억한다!
      // 이렇게 캐싱된 객체는 완전이 동일하다!
      // 4. 지연로딩(Lazy Loading)
      // @OneToMany의 fetch 옵션
      // 지연로딩을 사용하게 되면, 연결되어 있는 객체를 꼭 필요한 순간에만 가져온다
  • 색션 4 회고

    • JPA를 사용하면 더 편리하고 더 단순하게 코드를 사용할 수 있으나 JPA에 대한 공부를 꼼꼼하게 해야 올바르게 작성할 수 있을거 같고 트랜잭션의 기능이 처음 듣는 개념이지만 스프링을 이용할 때 너무나 좋은 기능이고 이 기능을 프로젝트에 적용시켜 보고 싶었습니다.

  • 섹션 5

    • 1. 연관관계를 사용하면 무엇이 좋을까??

      • 각자의 역할에 집중하게 된다! (= 응집성)

      • 새로운 개발자가 코드를 읽을 때 이해하기 쉬워진다.

      • 테스트 코드 작성이 쉬워진다.

    • 2. 연관관계를 사용하는 것이 항상 좋을까?

      • 지나치게 사용하면, 성능상의 문제가 생길 수도 있고

      • 도메인 간의 복잡한 연결로 인해 시스템을 파악하기 어려워질 수 있다.

      • 또한 너무 얽혀 있으면, A를 수정했을 때 B C D 까지 영향이 퍼지게 된다.

      • 비즈니스 요구사항, 기술적인 요구사항, 도메인 아키텍처 등 여러 부분을 고민해서 연관관계 사용을 선택해야 한다.

  • ! 원하는 기능에 대한 Entity는 필요한 서비스기능마다 하나씩 적용해서 하자!!

  • => 바뀔 경우 하나의 Entity만 수정하는 방향이 좋기 때문

  • 색션 5 회고

    • 색션 4의 기능들을 활용하는 색션이였고 이번 수업을 진행하면서 오타를 많이 내서 시간 지연이 많이 되었지만 더 강의를 오래 볼 수 있게 되서 좋았고 4-5색션에 중요성이 큰거 같고 더 꼼꼼히 해보고 혼자서 더 적용시켜보는 실습을 많이 진행해 보아야겠습니다.

  • 과제 4

  • 과제 5

    • https://www.notion.so/5-260b9f545f2942a79ba1f9308303dba1

    • => 주사위에 대해 어떤 방식을 통해 할지 고민하다 Map을 활용하면 더 깔끔하게 나올거같아 Map에 대해 공부하면서 적용시켜 보았습니다. 그리구 성공하게 되서 Map에 대해 알게된 과제가 되었습니다.

댓글을 작성해보세요.

채널톡 아이콘