☭DEVELOPER/#2 웹개발(자바기반 풀스택)

[BACKEND] SpringBoot 웹개발 DB 연동 테스트

조반짝 2023. 10. 12. 17:14
728x90
반응형

1. H2 데이터베이스 설치 : 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공
   https://www.h2database.com - Windows Installer (6.7 MB) 다운로드 및 설치

   h2-setup-2022-06-13.exe 실행해서 설치함 - 좌측 하단 시작 버튼 클릭

   - H2 Console을 바탕화면으로 드래그앤드롭으로 넣어줌

2. 데이터베이스 파일 생성 방법

   1) 바탕화면에 넣어준 H2 Console 아이콘을 더블클릭 합니다.

   2) Chrome 웹 브라우저 연결 확인(h2 DB 기본 포트는 8082 입니다)
      * 예시 웹 URL = http://192.168.56.1:8082/login.jsp?jsessionid=15063e28cc5342af608ab4787600975c

   3) 좌측 상단 "한국어" 선택하고, 처음에 한번은 
      저장한 설정: Generic H2 (Embedded), 설정 이름 : Generic H2 (Embedded),
      드라이버 클래스: org.h2.Driver, JDBC URL:  jdbc:h2:~/SpringBootWeb,
      사용자명: sa, 비밀번호: 공란 - 연결 버튼 클릭해서 들어갑니다.

   4) 두번째부터는 저장한 설정: Generic H2(Server)

   5) 설정 이름: Generic H2(Server) [옆에 저장 버튼 클릭]

   4) 드라이버 클래스: org.h2.Driver

   5) JDBC URL:  jdbc:h2:tcp://localhost/~/SpringBootWeb

   6) "연결" 버튼 클릭

   7)  ~SpringBootWeb.mv.db 파일 생성 확인
     (H2 DB 기본 파일 생성 위치는 사용자 계정 폴더입니다.
      예제에서는 C:\Users\starh 폴더에 SpringBootWeb.mv.db 파일이 생성되어 있습니다)
     (참고로, 만약에 C드라이브에 SpringBootWeb 폴더에 SpringBootWeb.mv.db 파일을 생성하거나
      경로 지정하고 싶을 경우에는
      JDBC URL: 경로를 jdbc:h2:tcp://localhost/C:/SpringBootWeb/SpringBootWeb 이라고 해주면 됩니다)

 [참고 : H2 데이터베이스의 MVCC 옵션은 H2 1.4.198 버전부터 제거되었음.
          1.4.200 버전에서는 MVCC 옵션을 사용하면 오류가 발생함]

3. JPA와 DB 설정

1) SpringBootWeb - 우클릭 - Spring -  Edit Starters 클릭
    - Spring Data JPA 추가해줌 - OK 클릭

2) 아래 메이븐 라이브러리 다운로드 웹사이트 주소에서
    h2-2.1.214.jar 파일 다운로드 받아서
    SpringBootWeb 프로젝트 안에 webapp 폴더 안에
    WEB-INF 폴더 만들고, 그 안에 lib 폴더 만들고,
    lib 폴더 안에 h2-2.1.214.jar 파일을 넣어줌.
   
   [아래 : 메이븐 라이브러리 다운로드 웹사이트 주소]
   https://mvnrepository.com/artifact/com.h2database/h2/2.1.214
   
   그리고, SpringBootWeb 프로젝트 - 우클릭 - Properties 클릭
   - Java Build Path - Web App Libraries 추가해서 /WEB-INF/lib 폴더 인식시켜줌.

3) main/resources/application.properties 파일 내용을 다음과 같이 환경 설정 코딩해줌

server.port=9008
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

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

spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true

===================================================================================

     spring.jpa.hibernate.ddl-auto: create
     이 옵션은 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성합니다.
    
    
     참고: 모든 로그 출력은 가급적 로거를 통해 남겨야 한다.
     > show_sql : 옵션은 System.out 에 하이버네이트 실행 SQL을 남깁니다.
                      실무 리얼 서버 구동 시에는 사용하지 마시기 바랍니다.

=======================================================================================

※ STS(또는 이클립스)의 Navigator 익스플로러 기준 SpringBootWeb 프로젝트 - src - main
   - java - com - springboot - first 패키지 안에 다음과 같이 Member.java 소스 코딩해 줌.

[Member.java 소스 코딩]

package com.springboot.first;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import lombok.Getter;
import lombok.Setter;

@Entity
@Getter @Setter
public class Member {

@Id @GeneratedValue
private Long id;
private String username;
}

=============================================================================================


※ STS(또는 이클립스)의 Navigator 익스플로러 기준 SpringBootWeb 프로젝트 - src - main
   - java - com - springboot - first 패키지 안에 다음과 같이
   MemberRepository.java 소스 코딩해 줌
  (참고로, SpringBoot의 Repository 파일은 JAVA/JSP/Spring에서
   DAO 파일과 비슷하다고 보시면 되십니다)

[MemberRepository.java 소스 코딩]

package com.springboot.first;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;


// SpringBoot의 Repository 파일은 JAVA/JSP/Spring에서
// DAO 파일과 비슷한 역할을 한다고 보시면 됩니다.

@Repository
public class MemberRepository {

@PersistenceContext
private EntityManager em;

public Long save(Member member) {
em.persist(member);
return member.getId();
}

public Member find(Long id) {
return em.find(Member.class, id);
}
}

==========================================================================================

※ JUnit4 테스트 설정
  1) STS(또는 이클립스)의 Navigator 익스플로러 기준 SpringBootWeb 프로젝트 - 우클릭 - Properties

     - Java Build Path - Add Library... - JUnit - Next - JUnit library version: JUnit 4 선택 - Finish 클릭

  2) STS(또는 이클립스)의 Navigator 익스플로러 기준 MemberRepository.java 클릭 선택 - 우클릭

      - New - JUnit Test Case 클릭 - Name: 란에 MemberRepositoryTest 입력 확인 - Finish 클릭

  [오류 해결] Junit4 Test 수행 시 "Could not run test ! No tests found with test runner 'JUnit 5'. OK 메시지가 나타난다면,
                MemberRepositoryTest.java - 우클릭 - Run As - Run Configurations...
                - Test 탭의 중간 하단 부분에서 Test runner: 를 JUnit 5 에서 JUnit 4 로 변경해 줌 - Apply - Run 클릭

 [오류 해결] MemberRepositoryTest.java 실행 시, jUnit 테스트에서 public ... 관련 3줄 에러가 나타난다면,
                MemberRepositoryTest.java - 우클릭 - Run Configurations - Test runner: 에서 JUnit 5 선택
                - Apply - Run 실행하시기 바랍니다.

  3) MemberRepositoryTest.java 소스 코딩

package com.springboot.first;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;


@RunWith(SpringRunner.class)
@SpringBootTest
class MemberRepositoryTest {  // 클래스 앞에 public 접근제어자가 없는지를 필히! 확인 바랍니다.

@Autowired
              MemberRepository memberRepository;

@Test
@Transactional // org.springframework.transaction.annotation.Transactional 사용하기 바람
@Rollback(false)
public void testMember() throws Exception{
//given
Member member = new Member();
member.setUsername("장나라");

// when
Long saveId = memberRepository.save(member);
Member finMember = memberRepository.find(saveId);

// then : Assertions는 org.assertj.core.api 패키지로 선택해야 함. org.junit.jupiter.api 패키지 아님
Assertions.assertThat(finMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(finMember.getUsername()).isEqualTo(member.getUsername());

}

}


===========================================================================================

  4) MemberRepositoryTest.java 파일 - 우클릭 - Run As - JUnit Test 클릭 - 우측 하단 JUnit 탭 확인
      - 로그에 Spring Data JPA 쿼리 메시지 확인

  [오류 해결] Junit4 Test 수행 시 "Could not run test ! No tests found with test runner 'JUnit 5'. OK 메시지가 나타난다면,
                MemberRepositoryTest.java - 우클릭 - Run As - Run Configurations...
                - Test 탭의 중간 하단 부분에서 Test runner: 를 JUnit 5 에서 JUnit 4 로 변경해 줌 - Apply - Run 클릭

  5) H2 Console 웹 사이트 확인
     http://192.168.56.1:8082/login.jsp?jsessionid=15063e28cc5342af608ab4787600975c

     [H2 DB SQL 쿼리문 확인]

     --오라클 DESC 와 같은 H2 DB 테이블 칼럼 형식 보는 SQL문
     SHOW COLUMNS FROM MEMBER; 

     -- SQL 쿼리문 실행 후 아래 내용을 확인해 봅니다.
     SELECT * FROM MEMBER;  

 
     [SQL 쿼리문 실행 후 아래 확인 내용]
     SELECT * FROM MEMBER;
     ID   USERNAME  
      1 장나라
     (1 row, 2 ms)


※ SpringBoot SQL 쿼리 파라미터 로그 확인 가능함
1) 참고 웹사이트 : https://github.com/gavlyukovskiy/spring-boot-data-source-decorator

2) p6spy 라이브러리 maven <dependency> 추가
<dependency>
    <groupId>com.github.gavlyukovskiy</groupId>
    <artifactId>p6spy-spring-boot-starter</artifactId>
    <version>1.7.0</version>
</dependency>

[참고 : gradle의 경우 다음과 같이 추가해 줌]
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.7.0'

3) SpringBoot SQL 쿼리 파라미터 로그 확인 가능함

Hibernate: insert into member (username, id) values (?, ?)
2021-04-04 23:57:15.410  INFO 7080 --- [           main] p6spy                                    : #1617548235410 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/SpringBootWeb
insert into member (username, id) values (?, ?)
insert into member (username, id) values ('장나라', 1);

 


https://www.h2database.com/html/download.html

설치하기

실행

연결 완료!

h2설정에서 빠진 데이터를 추가할 수 있다.

jar 다운로드

lib 폴더에 jar 붙여넣기

jar 잘 들어왔는 지 확인

 

https://github.com/gavlyukovskiy/spring-boot-data-source-decorator

 

GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-proxy, flexy-pool and s

Spring Boot integration with p6spy, datasource-proxy, flexy-pool and spring-cloud-sleuth - GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-p...

github.com

 

728x90
반응형