[인프런 워밍업 클럽 스터디] BE 스터디 1기 2주차 발자국
섹션 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 세팅
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
=> 주사위에 대해 어떤 방식을 통해 할지 고민하다 Map을 활용하면 더 깔끔하게 나올거같아 Map에 대해 공부하면서 적용시켜 보았습니다. 그리구 성공하게 되서 Map에 대해 알게된 과제가 되었습니다.
댓글을 작성해보세요.