스터디/스프링

스프링 공부 일지 - DB를 사용해보자!!

sleesm 2022. 11. 1. 10:52

 

오늘은 DB 접근 기술을 알아보고자 한다!!!

 

이전 블로그 👉👉

2022.11.01 - [스터디/스프링] - 스프링 공부 일지 - 웹 MVC 개발

 

스프링 공부 일지 - 웹 MVC 개발

오늘은 웹 MVC 개발을 해보려고 한다!! 이전 블로그 👉👉 2022.10.19 - [스터디/스프링] - 스프링 공부 일지 - 스프링 빈과 의존관계? 그게 뭔데? 스프링 공부 일지 - 스프링 빈과 의존관계? 그게 뭔데?

sleecode.tistory.com

 

 

 

 

 

 

 

 

 

 


 

H2 데이터베이스는 이번 수업을 통해 처음 써본다!!

 

개발이나 테스트 용도로 가볍게 사용하기 좋다고 한다!

게다가 웹 화면을 제공해서 편하긴 진짜 편한 것 같다 😁😁

 

 

 

아무튼 최신 버전의 H2 데이터베이스를 설치하고

실행하면 다음과 같은 콘솔창이 뜬다!

 

나는 윈도우즈라서 좀 더 사용하기 편했다!

cmd 창을 쓰지 않아도 그냥 바로 실행할 수 있기 때문!!!!

 

 

아무튼 처음 데이터베이스 파일을 생성하려면

 

jdbc:h2:~/{원하는 파일 이름}

 

으로 최초에 한 번 생성해줘야 한다!

 

 

그리고

 

~/{지정한 파일 이름}.mv.db

 

파일이 생성됐는지 확인하면 된다!

 

TIP.  제대로 생성이 안된다면 home 디렉터리에서 그냥 내가 텍스트 파일로 생성하고 이름을 변경해 줘도 된다 🤟🤟

 

 

 

이후에는 

 

jdbc:h2:tcp://localhost/~//{지정한 파일 이름}

 

로 접속하면 된다!!

 

( 위 주소로 접속하는 이유는 웹 애플리케이션과 서버 총돌이 날 수 있기 때문에 localhost로 접근하는 것이다!! )

 

 

 

test db 파일에 접속한 모습

 

 

 

 

 

 

 

 

 

 

 


 

H2 DB 설정이 끝났으니

이제 순수 JDBC를 사용해 보겠다!!!!

 

 

그전에 먼저 환경 설정을 해줘야 한다!!

 

☝ build.gradle에 아래 코드를 dependencies에 추가해줘야 한다!!

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'

 

✌ 스프링 부트 데이터베이스 연결 설정을 추가해줘야 한다!

resources/application.properties에 아래 코드를 추가하면 된다

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa

이때

username 설정 부분은 꼭 넣어줘야 한다!!

스프링 부트 2.4부터 적용되는 사항인데

만약 넣지 않으면 오류가 발생한다...

 

살짝 애를 먹은 부분,,,


 

 

 

 

이제 순수 JDBC로 리포지토리를 구현하면 된다!!

스프링을 사용하는 개발자들은 이제 대부분 사용하지 않는 방법이라고 한다!

하지만,, 이클립스로 순수 개발 프로젝트를 했던 사람으로

너무나 익숙한 코드들이다...ㅎㅎ

 

 

SpringConfig로부터 전달받은 DataSource를 생성자를 통해 주입받고

private Connection getConnection() {
    return DataSourceUtils.getConnection(dataSource);
}

를 통해 DB 커넥션을 받고 사용하면 된다!!

 

참고로 스프링 부트는 DB 커넥션 정보를 바탕으로 DataSource를 생성하고 빈으로 만들어둔다고 한다!!!

 

 

 

 

자세한 코드는 여길 참고!! 제 깃헙임😁😁

https://github.com/sleesm/spring-for-beginner/blob/main/introdunction-to-spring/src/main/java/hello/hellospring/repository/JdbcMemberRepository.java

 

GitHub - sleesm/spring-for-beginner

Contribute to sleesm/spring-for-beginner development by creating an account on GitHub.

github.com

 

 

 

 

 

 

 

 


 

 

다음은 스프링 JdbcTemplate를 사용하는 방법이다!!

 

환경설정은 순수 JDBC랑 동일하다

대부분의 반복 코드를 제거해 주지만 SQL을 직접 작성해야 한다,,

 

쿼리를 짜는 것 대신에 사용한 Jdbc Template 함수들

 

 

 

 

 

 

 


그리고 요즘 사람들이 가장 많이 쓴다는 

JPA 이다!!

 

JdbcTemplate보다 더 앞서나간 형태로

기본적인 SQL도 알아서 만들어서 실행해 준다!!

그렇기 때문에 데이터 중심 설계가 아닌, 객체 중심 설계가 가능하다는 점!!!

 

 

먼저 환경설정에 JPA를 추가해줘야 한다!!

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none

 

참고 👉👉 JPA가 인터페이스라면 hibernate는 구현체라고 할 수 있다!!

 

 

 

 

 

 

 

 

 

☝ JPA는 먼저 엔티티 매핑이 필요하다!!

 

( DB의 테이블을 객체화했다고 생각하면 편하다 )

기본적으로 @Entity 어노테이션을 추가하고

@Id로 PK를 설정해 주면 된다!

 

Member 엔티티 매핑

 

 

 

 

 

 

 

✌ 그다음으로 JPA에 맞는 리파짓토리를 수정해줘야 한다!

 

JPA는 기본적으로 EntityManager로 동작한다

앞서 말한 DataSource를 자동으로 가져서 내부적으로 DB와 통신해 준다

 

 

JPA 라이브러리를 다운로드하면 자동으로 스프링 부트가 EntityManger를 만들고

이걸 다음 코드처럼 주입시켜 주면 된다!!

private final EntityManager em;

public JpaMemberRepository(EntityManager em) {
    this.em = em;
}

 

 

 

 

그다음으로 member 객체를 만들면 DB에 넣어줘야 하는데

이걸 EntityManager의 .persist() 를 통해 한다!

@Override
public Member save(Member member) {
    em.persist(member);
    return member;
}

JPA가 Insert call을 만들어서 DB에 넣고

Id를 리턴해주는 구조이다!!

 

 

 

 

조회를 할 때는 쿼리를 만들어야 하는데

SQL을 사용하는 것이 아니라 JPQL을 사용한다!!

(JPA에 맞춰 객체 중심으로 쿼리를 작성할 수 있다)

@Override
public List<Member> findAll() {
    return em.createQuery("select m from Member m", Member.class).getResultList();
}

 

 

 

 

 

 

 

 

 

 

🤟 이제 서비스 계층에 @Transactional 어노테이션을 추가해 주면 된다!!

 

참고로 JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행돼야 한다!!

 

@Transactional
public class MemberService {
	...
}

 

트랜잭션을 사용하지 않은 경우에는 아래와 같이 오류가 생기니 주의해야 한다!!!

@Transaction을 사용하지 않은 경우

 

 

Transaction 사용 후 모두 잘 됨

 

 

 

이렇게 된 걸 실행하면 http://localhost:8080/members에서 데이터 목록을 조회할 수 있다

http://localhost:8080/members 에서 DB 목록 확인 가능

 

 

http://localhost:8080/members/new를 통한 새로운 데이터 생성도 확인할 수 있다

DB 목록 확인 가능

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


다음은 가장 간단한 형태인

스프링 데이터 JPA이다!!

 

JPA에서 한 단계 더 나아간 형태이다

리파짓토리를 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있다 🙊🙊

 

기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공한다고 한다..

( JPA를 편리하게 사용할 수 있도록 도와주는 기술 )

 

 

스프링 데이터 JPA를 사용한 리파짓토리

 

 

 

고냥 이렇게만 해주면 끝이라고 한다.. 두둥 말도 안 돼

오버라이드를 해서 findByName() 함수를 넣어주는 형식이라고 한다..

 

하지만 아무튼 이렇게 해서 다 된다는 게 놀라울 따름

아마도 아직은 엄청 작은 예제를 가지고 하기 때문에 단출한 것이지만

 

제대로 익힌다면 장난 아니게 편리할 것 같다..

 

 

 

 

 

 

 

⚠ 하지만 주의해야 할 점이 있다!!  ⚠

 

findByID 라고 설정했던 MemberRepository에서 에러가 발생했다!!

 

nested exception is org.springframework.beans.factory.BeanCreationException

이었고, 그중 

defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration

문제였다!!

 

그래서 findByID를 findById로 변경하니 정상 처리 되었다!!

왜냐하면 JpaRepository 에서 제공하는 함수가 findAllById 형태로 되어 있기 때문이었다!

JpaReopository에서 제공하는 함수 코드

 

findById로 변경한 후 정상 처리된 테스트 결과

 

 

 

 

혹은 이렇게 추가해 주면 된다!라고 생각했으나 안됨! 왜지?!!

ID는 기본으로 들어가야 해서 그런 것 같다!!

 

 

라고 생각하고 일단 인프런에 질문을 드렸다!!

 

답변은

아래와 같은 기본적인 규칙을 지켜야 한다고 한다!!!

 

 

 

 

 

 

그러니 다들 사용할 때 주의가 필요한 것 같다!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

아무튼 이렇게 DB에 접근하는 4가지 방법을 살펴봤다!

익숙한 순수 JDBC도 있었고,

이를 좀 더 쉽게 사용하는 JdbcTemplate

 

그리고 신세계에 가까운 JPA와 스프링 데이터 JPA

 

스프링은 배우면 배울수록 배울 게 많은 것 같아 조금 걱정이지만 아직은 재밌다!! 😁😁😁

 

 

 

 

 

 

 

 

 

 

 

 


오늘은 좀 내용이 많았돠,,

힘들었돠,,

 

 

그럼 안녕!!!!!!!!!!!!!🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌