본문 바로가기

Java

[STS] SpringBoot Database postgreSQL JDBC 연동(Hibernate, JPA, SLF4J2 + Log4j2)

반응형

1. local postgreSQL 환경 설정

  • postgreSQL설치
  • superuser(postgres) password 설정 시 잊어버리시면 안됩니다.
  • 기본 포트 : 5432

https://www.postgresql.org/download/

 

PostgreSQL: Downloads

 

www.postgresql.org

 

  • DBeaver 설치

https://dbeaver.io/download/

 

Download | DBeaver Community

Download Tested and verified for MS Windows, Linux and Mac OS X. Install: Windows installer – run installer executable. It will automatically upgrade version (if needed). MacOS DMG – just run it and drag-n-drop DBeaver into Applications. Debian package

dbeaver.io

 

  • 테스트 해볼 user_bas 테이블 생성
create table user_info (
	user_id varchar(20) primary key, --기본키
	passwd varchar(20) not null,
	user_nm varchar(10) not null,
	fail_login_cnt int default 0, --default 0
	cret_dt timestamp,
	amd_dt timestamp
);

 

  • 테스트 데이터 insert
insert into user_info values('admin', 'admin','admin',0, now(), null);

 

 

 

2. SpringBoot JDBC PostgreSQL 설정

 

  • pom.xml 에 붙여넣기 (dependencies 하위에 기재)
  • <scope>runtime</scope> 옵션은 실행시 필요한 라이브러리(자세한건 아래 url reference 참고)
<!-- DB -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.4.1</version>
    <scope>runtime</scope>
</dependency>
 

Maven – POM Reference

POM Reference POM stands for "Project Object Model". It is an XML representation of a Maven project held in a file named pom.xml. When in the presence of Maven folks, speaking of a project is speaking in the philosophical sense, beyond a mere collection of

maven.apache.org

 

  • /src/main/resources sources folder 생성(폴더가 존재한다면 미생성)
  • application.properties 파일 생성

 

  • application.properties 파일에 datasource 정보 기재
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=password
spring.datasource.platform=postgres

 

 

 

3. Junit으로 database 연결 테스트

  • /src/test/java/com/PostgreSQLConnectionTest.java 파일 생성
package com;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.Test;

public class PostgreSQLConnectionTest {
	private String URL = "jdbc:postgresql://localhost:5432/postgres";
	private String USERNAME = "username"; //postgresql 계정
	private String PASSWORD = "password"; //비밀번호
	
	@Test
	public void ConnectionTest() throws Exception{
		Connection con = DriverManager.getConnection(URL,USERNAME,PASSWORD); //db 연결
		System.out.println(con); //연결 정보 출력
		Statement pre = con.createStatement();
		ResultSet rs = pre.executeQuery("select * from user_info");

		if (rs.next()) {
		    System.out.println(rs);
		    System.out.println(rs.getString("user_id"));
		}
	}
}

 

  • Maven install 후에 Junit Test 실행
  • connection 정보, 결과set 정보, 결과set 중 데이터 정보 확인

Maven install 로그

 

 

 

4. Hibernate, JPA, querydsl 설정

  • hibernate-entitymanager으로 설정시 hibernate-core 도 같이 내려받습니다.
  • pom.xml
<!-- hibernate -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.3.10.Final</version>
</dependency>

<!-- JPA -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- querydsl -->
<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <version>4.0.6</version>
</dependency>
<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
    <version>4.0.6</version>
</dependency>

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.23.1-GA</version>
</dependency>

<build>
    <plugins>
        <!-- querydsl -->
        <plugin>
            <groupId>com.mysema.maven</groupId>
            <artifactId>apt-maven-plugin</artifactId>
            <version>1.1.3</version>
            <dependencies>
                <dependency>
                    <groupId>com.querydsl</groupId>
                    <artifactId>querydsl-apt</artifactId>
                    <version>4.2.1</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>process</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/generated-sources/annotations</outputDirectory>
                        <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        <logOnlyOnError>true</logOnlyOnError>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

 

  • pom.xml
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false

 

 

 

5. SLF4J2 + Log4j2 설정

 

[JAVA Logging] SLF4J(Simple Logging Facade for Java)란 무엇일까

Simple Logging Facade for Java의 약자로 로깅 프레임워크(ex: logback, log4j)에 대해 추상화 역할을 합니다. 최종 배포 시 사용자가 원하는 로깅 프레임워크로 배포할 수 있게 되는데 Facade에서 의미를 찾을

crong-cat.tistory.com

 

 

SLF4J Binding Using Log4j – Log4j 2 SLF4J Binding

<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apa

logging.apache.org

 

  • pom.xml 수정(아래 코드 추가)
<!-- slf4j2 + log4j2 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j2-impl</artifactId>
    <version>2.19.0</version>
    <scope>test</scope>
</dependency>

 

  • log4j2.xml 파일 생성
  • src>main>resources 하위에 있어야 한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
 
 <!-- Appender, Layout 설정 -->
 <Appenders>
  <Console name="console" target="SYSTEM_OUT">
   <PatternLayout/>
  </Console>
  <File name="file" fileName="./logs/file/sample.log" append="false">
   <PatternLayout pattern="%d %5p [%c] %m%n"/>
  </File>
 </Appenders>
 
 <!-- Logger 설정 -->
 <Loggers>
  <Logger name="egovLogger" level="DEBUG" additivity="false">
   <AppenderRef ref="console"/>
   <AppenderRef ref="file"/>
  </Logger>
  <Root level="ERROR">
   <AppenderRef ref="console"/>
  </Root>
 </Loggers>
 
</Configuration>

 

 

 

6. lombok 설정

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

 

  • maven install
  • lombok install

    - maven install을 하면 maven dependencies가 업데이트가 됩니다.

    - 목록 중 lombok을 찾아 우클릭 > Run As > Java Application 으로 lombok을 실행해줍니다.

 

 

 

    - IDE 를 찾을 수 없다고 나오네요.

    - OK 를 클릭해주고, Specify  location... 클릭해서 sts가 설치된 경로로 이동해줍니다.

 

 

 

    - SpringToolSuite4.exe 파일이 있는 곳으로 이동해 선택해줍니다.

 

 

 

    - Install / Update 클릭

 

 

 

    - Quit Installer 클릭으로 설치 창을 닫아줍니다.

    - STS 재시작

 

 

  • STS > Project > Clean

 

 

 

7. log.info(); 

  • PostgreSQLConnectionTest.java 수정
  • system.out.println() 으로 출력했던 것들 모두 log.info() 로 변경
package com;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.Test;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class PostgreSQLConnectionTest {
	private String URL = "jdbc:postgresql://localhost:5432/postgres";
	private String USERNAME = "username"; //postgresql 계정
	private String PASSWORD = "password"; //비밀번호
	
	@Test
	public void ConnectionTest() throws Exception{
		Connection con = DriverManager.getConnection(URL,USERNAME,PASSWORD); //db 연결
		log.info(con.toString()); //연결 정보 출력
		Statement pre = con.createStatement();
		ResultSet rs = pre.executeQuery("select * from user_info");

		if (rs.next()) {
		    log.info(rs.toString());
		    log.info(rs.getString("user_id"));
		    log.info("user_info table user_id column : {}", rs.getString("user_id"));
		}
	}
}

 

  • Junit test

 

 

  • log.info 에서 오류가 난다면 lombok을 인식하지 못하고 있는 것이니 STS 재실행 후 Clean 또는 maven clear 후에 maven install 해보시길 바랍니다.

 

 

 

8. JDBC 설정

  • lombok, slf4j2+log4j2 설정이 완료됐으니, jdbc 설정해주도록 하겠습니다.
  • log4jdbc 공식 문서를 참고했습니다.
  • https://log4jdbc.brunorozendo.com/
 

Log4jdbc-log4j2

This project was imported from https://code.google.com/archive/p/log4jdbc-log4j2/ Original License: Apache License 2.0 log4jdbc-log4j2 is a modification of log4jdbc to natively use Log4j 2 (or SLF4J as usual), that supports JDBC 4.1 to JDBC 3, includes all

log4jdbc.brunorozendo.com

 

 

  • pom.xml
<!-- JDBC -->
<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
    <version>1.16</version>
</dependency>

 

  • application.properties
  • TO-BE 내용으로 변경해줍니다.
#AS-IS
#spring.datasource.url=jdbc:postgresql://localhost:5432/postgres

#TO-BE
spring.datasource.url=jdbc:log4jdbc:postgresql://localhost:5432/postgres
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

 

  • log4jdbc.log4j2.properties 파일 생성(slf4j 사용시)

 

  • log4jdbc.log4j2.properties
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

 

 

9. Test Code 작성

  • UserController.java
package com.user.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.user.domain.User;
import com.user.service.UserService;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class UserController {
	@Autowired
	UserService userService;
	
	@GetMapping(path = "/api/login")
	public User login(@RequestParam String userId, @RequestParam String passwd) {
		return userService.getUserInfo(userId, passwd);
	}
}

 

  • User.java
package com.user.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Entity(name="user_info")
public class User {
	@Id
	@Column(name = "user_id")
	String id;
	String passwd;
	String userNm;
	int failLoginCnt;
}

 

  • UserService.java
package com.user.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.user.domain.User;
import com.user.repository.UserRepository;

@Service
@Transactional(readOnly = true)
public class UserService {
	@Autowired
	UserRepository userRepository;
	
	public User getUserInfo(String userId, String passwd) {
		return userRepository.findByIdAndPasswd(userId, passwd);
	}
}

 

  • UserRepository.java
package com.user.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;

import com.user.domain.User;

public interface UserRepository extends JpaRepository<User, String>, QuerydslPredicateExecutor<User>{
	User findByIdAndPasswd(String userId, String passwd);
}

 

 

 

10. API 호출로 출력 결과 Test

  • API Test 도구로는 여러가지가 있는데, 저는 Postman 사용했습니다.
  • 결과가 정상적으로 나온것을 확인할 수 있습니다.

 

  • postman

https://www.postman.com/downloads/?utm_source=postman-home 

 

Download Postman | Get Started for Free

Try Postman for free! Join 20 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster.

www.postman.com

 

반응형