JPA란

java persitence api로써 orm기술에 대한 API 표준이다.
jpa는 인터페이스이고 구현체로는 hibernate, eclipselink, datanucleus등 있고 가장 대표적인것이 하이버네이트를 사용한다.

JPA장점

  1. 특정 데이터베이스 종속되지않음.
    특정 데이터베이스가 아닌 객체에 접근하여 개발이 되기떄문에 컨버젼등 용이하다.
    이유는 추상화된 접근계층을 제공하기 때문이다.
    하지만 내가 생각하기에는 어느정도 수정은 필요하다.
    [만약 oracle을 사용하여 sequence전략을 사용하다가 mysql로 바꿨을때
    identity전략으로 변경해야되는경우 등 변수가 있기때문에 무조건적으로 종속이
    안된다고는 볼수 없다.
    그리고 특수한경우 connect by라 이런부분들을 jpa에서 제공하지않는 native나
    mybatis를 연동했다고 가정하자.
    그럼 이런부분은 oracle만 사용가능하기때문에 문제가 발생된다.
    즉. 무조건적으로 자동 변환되지 않는다. 이런 맹점도 있기때문에 절대적이라고 생각하면 안된다.]
  2. 객체지향적인 프로그래밍
    JPA를 사용하면 데이터베이스중심에서 객체지향적 설계가 가능하다.
    이부분은 절대적으로 동의한다. 그리고 테스트코드를 작성하는데도 엄청유리하다.
    비즈니스 로직을 DB에서 가져가버리면 테스트코드를 작성하는데 어려움이 너무많다.
    mock객체를 쓰지않고서는 테스트도 하기 힘들어진다.
  3. 생산성 향상
    기본적인 c-r-u-d에 대한 쿼리문을 제공한다.
    근데 솔직히 실무에서 update, delete나 조건이 많다. 단순 쿼리는 거의 없었다.

JPA단점

  1. 복잡한 쿼리처리
    통계같은 복잡한쿼리나 서브절등 사용할 경우 SQL문을 사용해야될 수가있다.
    이때에 JPQL이나 querydsl등 사용가능한 기술들이 있는데 사용해봤을때 난이도가 상당했다.
  2. 성능저하 위험
    객체간의 매핑 설계를 잘못했을때 성능저하가 올수 있고 N+1이라는 오류를 범 할수 있다. N+1이란 N개의 행에대한 쿼리가 나가는것이다.
  3. 학습시간
    JPA를 다룰려면 데이터베이스도 이해해야하고 도메인도 이해를 해야한다.
    더군다나 JPA의 기본지식과 추가적으로 앞서말한 jpql, querydsl등의 기술도 알아야한다. 여차하면 native sql이나 mybatis를 연동해서 사용 할 수도 있다.

JPA 동작방식

  1. 엔티티
  • 엔티티란 데이터베이스 테이블에 대응하는 클래스이다.
  1. 엔티티 매니저 팩토리
  • 앤티티 매니저 인스턴스를 관리하는 주체이다.
  • 애플리케이션 실행시 한개만 만들어지며 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 앤티티 매니저를 생성한다.
  1. 엔티티 매니저
  • 앤티티 매니저란 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공
  • 내부적으로 데이터베이스 커넥션을 사용해서 데이터베이스에 접근
    -- find() : 영속성 컨텍스트에서 엔티티를 검색하고 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장
    -- persist() : 엔티티를 영속성 컨텍스트에 저장
    -- remove() : 엔티티클래스를 영속성 컨텍스트에 삭제
    -- flush() : 영속성컨텍스트에 저장된 내용을 데이터베이스에 반영
  1. 영속성 컨테스트

    비영속(new) : new 키워드를 통해 생성된 상태로 영속성과 관련이 없는 상태
    영속(managed) :
  • 엔티티가 영속성 컨텍스트에 저장된 상태로 영속성 컨텍스트에 의해 관리되는 상태
  • 영속 상태에서 데이터베이스에 저장되지 않으며, 트랜잭션 커밋 시점에 데이터베이스에반영
    준영속상태(detached): 영속성 컨텍스트에 엔티티가 저장되었다가 분리된 상태
    삭제상태 : 영속성 컨텍스트와 데이터베이스에서 삭제된 상태

영속성 컨텍스트 사용 시 이점

  1. 1차캐시
    영속성 컨텍스트에는 1차개시가 존재하며 불필요하게 데이터베이스에 접근을 하지않고도 데이터를 가져올 수 있다.
    즉 1차캐시를 먼저 조회하고 없으면 데이터베이스에접근해서 조회후 1차캐시에 저장 하고 반환한다.
  2. 동일성 보장
    하나의 특랜잭션에서 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회시 같은값을 보장
  3. 트랜잭션을 지원하는 쓰기 지연
    연속성 컨텍스트 안에서 쓰기지연 SQL저장소가 존재하고
    1차 캐시에 저장되는것과 동시에 쓰기지연 SQL 저장소에 SQL문이 저장된다.
    이렇게 SQL을 쌓아두고 트랜잭션을 커밋하는 시점에 저장된 SQL문들이 flush되면서 데이터베이스에 반영된다.
  4. 변경감지
    JPA는 1차 캐시에 데이터베이스에서 처음불러온 엔티티의 스냅샷을 가지고 있다.
    그리고 1차캐시에 저장된 엔티티와 스냅샷을 비교하여 다르면 update문이 발생된다.

mysql application 설정

mysql 비밀번호 변경

나는 내가 자주쓰는 비밀번호를 해버려서 어쩔수 없이 바꿨는데 바꾸는 방법은 간단한다.
1. cmd 관리자 권한 실행
2. cd programfiles\mysql\mysql server8.0(나는 8.0)\bin 접속
3. mysql -u root -p 입력
4. 패스워드 입력
5. select host, user, plugin, authentication_string, password_last_changed form user; 입력
6. 나의 환경 확인
7. alter user 'root'@'localhost' identified with mysql_native_password by '1234'; 입력
8. flush privileges;
하면 끝이다. 8번은 저장하는거고 7번같은경우 버전마다 다르기떄문에 구글링 ㄱㄱ

이번 챕터의 나의 생각

간단한 mysql을 적용해보았다. 비밀번호를 내가 자주사용하는 걸로해서
바꿔야될 경우가 생겼는데 또 다른 경험이었다. 이렇게 백문이불여일타이다...
면접볼떄 JPA 장단점을얘기하면서 어부버거렸는데... 긴장을 너무한탓에 기억이 재대로 나지 않았다. 자바나 코틀린처럼 객체지향적인 프로그램만 사용하면 좋다고 생각한다.

profile
긍정적인 삶을 갖자~~

0개의 댓글