DB에 데이터를 어떻게 저장하지? (24.05.21)

YJ·2024년 5월 21일
post-thumbnail

블로그 작성법
목표 > 공부한 내용 > 얻었고, 앞으로 이걸 해봐야지 적기

✋ 수업 목표

  • JDBC: DataSource로 Connection
  • JPA: EntityManager로 SQL
  • Spring Data JPA로 interface method()

🤔 공부한 내용

앞으로 진행할 것
1. Spring boot 패키지 단위로 정리
2. AWS에 프로젝트 올리기

@Autowired DataSource

@Autowired
DataSource dataSource;

여기까지 진행하면, property에 값이 있으면 생성된다!

정상적으로 돌아가는지 확인하는 방법은 property를 사용해봐야 한다.
properties 값이 정상인지 오류인지 확인

터널 뚫기를 진행해보자.

터널을 뚫는 다는 거는 DB랑 connection을 만드는 것 이다.

참조 자료
https://velog.io/@sians0209/Spring-Spring-gradle-MySQL-JPA-%EC%97%B0%EB%8F%99

https://pcm9881.tistory.com/130

1. DataSource로 커넥션 시도 방법

DataSource는 hikari 구현체가 만들어준다.

MEmberRepository.class

@Autowired
DataSource dataSource;

public void makeConnection() {
	DataSourceUtils.getConnection(dataSource);
}

참조 자료
https://velog.io/@sians0209/Spring-Spring-gradle-MySQL-JPA-%EC%97%B0%EB%8F%99

에러 참고 자료
https://psip31.tistory.com/139

2. Spring Data JPA 커넥션 시도 방법

  1. dependency 추가

Maven Project
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa/3.2.5

  • hibernate (JPA의 기본 구현체)
  • Hikari (JDBC API 기본 구현체)
  1. EntityManager 객체 (스프링 자동 스프링 빈 등록)
    hibernate 구현체가 만들어준다.

  2. EntityManager: save 메소드에서 put -> Insert, get -> Select

  • persist(object) : 영속화 한다. = 영속성 컨텍스트(공간)
    cf. 영속성 컨텍스트란?
    영속화된 객체(Entity)들이 모여 있는 공간
  1. Member class 에 @Entity, @Id

  2. select 역할 메소드 : find()

  3. Spring, JPA 둘 다 타입까지 알려줘야 한다. 타입이 중요하다.

JPA

자바 - 관계 패러다임 불일치 해소

DB가 객체가 객체를 가질 수 있는 방법이 있을까?
Object와 Relational이 Mapping이 되는 방법?

ORM 기술을 가진 구현체: HiberNate
JDBC API 구현체: hikari

로그인

로그인을 하고, JPA의 EntityManager로 구현해보자.

  • 로그인 실패도 고려
  1. Repository : SQL 단위로 메소드로 쪼개기

트랜잭션

사용자의 요구사항(비즈니스 로직)을 성공적으로 대응하기 위해
SQL을 특정 단위로 묶은 덩어리

비밀번호를 변경한다고 가정해보자.

  • 입력
    • 기존 비밀번호
    • 새 비밀번호

순서

  1. userId로 조회 = 기존 비밀번호가 맞는지 확인
  2. 새 비번으로 수정 -> SQL result : affected row
  3. userId로 조회
    [시스템 입장] : 1~3) 따로따로 성공 가능
    [유저 입장] : 통째로만 의미가 있다.

@Transactional

메소드가 모두 정상적으로 끝날 때 까지 기다렸다가

  • 성공
    모두 성공하면 한번에 DB 적용 & Commit

  • 실패
    만약 중도에 하나라도 실패하면, 이전에 성공했던거 다 롤백

@Transactional의 범위를 어떻게 지정할까?

Repository
: 시스템 입장 (메소드 단위 - SQL 단위)

Service @Transactional
: 유저 입장 (메소드 단위 - 로직 단위)

JPQL

Java Persistence Query Language
JPA가 자바 개발자들을 위해서,
자바 세상에서 자바스러운 SQL을 쓰면 (like 슈도 코드)
= JPA가 자바의 패러다임으로 한겹 싸줌
DB의 SQL로 바꿔서 쓴다.

ex.
SQL: SELECT *(모든 컬럼) FROM member(테이블명);
JPQL: SELECT m(객체 또는 필드) FROM Member(Entity 클래스명) as m(별칭);

  • EntityManager가 지원해주는 메소드
  • find(클래스명, 식별자) : 식별자로만 찾을 수 있는 객체
  • persist(객체)
  • remove(객체)
  • createQuery(JPQL): EntityManager가 지원

JPQL: SELECT m FROM Member (AS) m WHERE m.userId = :파라미터명 createQuery(JPQL, Member.class)
.setParameter("파라미터명", 매개변수)
.getSingleResult() // getResultList()

알쓸송잡
Q. 리팩토링은 주로 언제할까?
// 잘게잘게 쪼개서, 한번에 절대 많이 하지 말 것
// 리팩토링 하기 전 준비: 백업, 테스트, 인증된 툴(IDE)
1. 에러가 안 보일 때
2. 에러를 고칠 때
3. 가독성이 너무 안 좋을 때 (프로젝트를 일단락시킬 때)
4. 기능 추가하기 전에

😉 앞으로 이걸 해봐야지

이제 JPA, JDBC 등을 사용하여 Map에 저장하던 데이터를 MySQL에 저장하도록 Repository 코드를 수정하였다. DB와 어떻게 효율적으로 소통할지 생각해보자.

profile
dev

0개의 댓글