티스토리 뷰

# PostgreSQL 설치

https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

 

PostgreSQL Database Download | EnterpriseDB

PostgreSQL Database Download

www.enterprisedb.com

상단 링크로 가서 자신의 운영체제에 맞는 installer를 다운로드한 뒤 설치합니다.

설치 도중에 입력하는 password는 꼭 기억해놓도록 하고 나머진 다음만 누르면서 설치하면 됩니다.


# DATABASE 생성 및 사용자 생성

시작 메뉴에서 psql을 찾아 실행합니다.

위 사진의 '사용자의 암호'에 설치할 때 설정한 password를 입력하면 됩니다.


※PostgreSQL은 기본적으로 오토 커밋이 적용되어 있습니다. psql에서 AutoCommit을 해제할 수 있습니다. 

  (pgAdmin의 AutoCommit은 별도로 설정해주어야 합니다. 그건 아래에서...)

$ \set AUTOCOMMIT off
$ \echo :AUTOCOMMIT // AUTOCOMMIT 상태 확인

이제 데이터베이스를 생성합니다. 아래 명령어를 입력하세요.

$ CREATE DATABASE spring; // 데이터베이스 생성
$ \list // 데이터베이스 목록 조회

그 후 아래 명령어로 사용자를 생성하고 위에서 생성한 DB의 권한을 부여합니다.

$ CREATE USER springuser PASSWORD 'springuser';
$ GRANT ALL ON DATABASE spring TO springuser;
$ \du // 사용자 목록 조회

# 샘플 데이터 생성

시작 메뉴에서 pgAdmin을 찾아 실행합니다. (현재 최신은 pgAdmin4)

아래 화면이 나타나면 Servers를 우클릭 한 뒤 Server탭을 찾아 클릭합니다.


Name을 입력하고 Connection 탭을 클릭합니다.

 

위에서 생성했던 DATABASE와 User 정보를 입력한 뒤 Save 합니다.


spring db를 찾아 우클릭하여 쿼리 툴을 오픈합니다.


아래 쿼리를 실행하여 샘플 테이블 및 데이터를 생성합니다.

begin;

CREATE TABLE cities (
  	id integer PRIMARY KEY,
  	name varchar(100),
	population integer
);

INSERT INTO cities(id, name, population) VALUES (1, 'Bratislava', 432000);
INSERT INTO cities(id, name, population) VALUES (2, 'Budapest', 1759000);
INSERT INTO cities(id, name, population) VALUES (3, 'Prague', 1280000);
INSERT INTO cities(id, name, population) VALUES (4, 'Warsaw', 1748000);
INSERT INTO cities(id, name, population) VALUES (5, 'Los Angeles', 3971000);
INSERT INTO cities(id, name, population) VALUES (6, 'New York', 8550000);
INSERT INTO cities(id, name, population) VALUES (7, 'Edinburgh', 464000);
INSERT INTO cities(id, name, population) VALUES (8, 'Berlin', 3671000);

commit;

SELECT * FROM CITIES;

pgAdmin은 실행할 때 기본적으로 AutoCommit이 활성화되어 있습니다.

아래의 2가지 방법을 통해 상황에 맞게 AutoCommit을 비활성화시킬 수 있습니다.

@일시적으로 해제

@기본값을 수정


# SpringBoot에 PostgreSQL 연동

/build.gradle에 의존성을 추가합니다.

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'

	// DB
	compile group: 'org.postgresql', name: 'postgresql', version: '42.2.5'

	// Logging
	compile group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.1', version: '1.16'
}

src/main/resources/application.properties에 추가

#Server Encoding
spring.http.encoding.charset=utf-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true

#Datasource Configuration
spring.datasource.sql-script-encoding=utf-8
spring.datasource.initialization-mode=always
spring.datasource.platform=postgres
spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:postgresql://localhost:5432/spring
spring.datasource.username=springuser
spring.datasource.password=springuser

#JPA Configuration
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

@datasource

- sql-script-encoding : schema.sql, import.sql같은 script 파일의 encoding 설정

- initialization-mode : 애플리케이션 구동 시 classpath에 schema.sql 파일이 있다면 안의 쿼리를 실행할지 여부 ( always, never )

 

※spring boot에서 설정 가능한 프로퍼티들이 궁금하다면 아래 링크에서 확인하세요.

https://zetawiki.com/wiki/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8_%EB%8D%B0%EC%9D%B4%ED%84%B0_%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0

 

스프링부트 데이터 프로퍼티 - 제타위키

다음 문자열 포함...

zetawiki.com

@jpa

- show-sql : 쿼리 로그는 log4j를 사용하기 때문에 false.

- ddl-auto : sessionFactory가 시작될 때 Entity 객체 구성과 매핑되는 DB 스키마에 대한 작업을 정의.

  > none : 아무것도 실행하지 않는다 (일반적으로 DB의 기본값).

  > create : SessionFactory가 시작될 때 DB 스키마를 전부 삭제하고 재생성합니다.

              생성한 뒤 classpath에 import.sql 파일이 있다면 안의 쿼리를 실행합니다.

  > create-drop : create와 동일하지만 SessionFactory가 내려갈 때 DB 스키마를 삭제합니다.

  > update : Entity 객체 구성과 DB의 스키마를 비교해 필요한 테이블이나 칼럼이 없을 때 Entity 객체에 맞춰 DB 스키마를 변경합니다.

               데이터나 스키마를 삭제하지는 않습니다.

  > validate: Entity 객체 구성과 DB 스키마 간에 차이점이 있는지 확인하고 차이가 있다면 예외를 발생시킵니다.


src/main/resources/schema.sql 생성

-- spring.datasource.initialization-mode 속성을 always로 설정해야 함
-- 어플리케이션 시작 시 실행되는 Sql 파일
-- 초기화 작업이 필요하다면 여기서 처리

-- 어플리케이션이 시작할 때 샘플 테이블을 초기화
DROP TABLE IF EXISTS cities;
CREATE TABLE cities(id serial PRIMARY KEY, name VARCHAR(100), population integer);

INSERT INTO cities(name, population) VALUES('Bratislava', 432000);
INSERT INTO cities(name, population) VALUES('Budapest', 1759000);
INSERT INTO cities(name, population) VALUES('Prague', 1280000);
INSERT INTO cities(name, population) VALUES('Warsaw', 1748000);
INSERT INTO cities(name, population) VALUES('Los Angeles', 3971000);
INSERT INTO cities(name, population) VALUES('New York', 8550000);
INSERT INTO cities(name, population) VALUES('Edinburgh', 464000);
INSERT INTO cities(name, population) VALUES('Berlin', 3671000)

마지막으로 log4j 설정을 해줍니다. 아래와 같이 파일을 생성해주세요.

src/main/resources/log4jdbc.log4j2.properties

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

 

src/main/resources/logback.xml

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>
    </encoder>
  </appender>
  
  <logger name="jdbc" level="OFF"/>
  
  <logger name="jdbc.sqlonly" level="OFF"/>
  <logger name="jdbc.sqltiming" level="DEBUG"/>
  <logger name="jdbc.audit" level="OFF"/>
  <logger name="jdbc.resultset" level="OFF"/>
  <logger name="jdbc.resultsettable" level="DEBUG"/>
  <logger name="jdbc.connection" level="OFF"/>
  
  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
  
</configuration>

# 실행

$ gradle bootRun

schema.sql파일의 쿼리가 콘솔에 제대로 로깅되며 서버가 시작되는지 확인합니다.


# 마치며

이상으로 PostgreSQL 연동도 완료되었습니다.

다음 포스팅에서는 SpringBoot에 GraphQL을 적용합니다.

그 후 Graphql에서 제공하는 PlayGround를 이용하여 이번 포스팅에서 생성했던 샘플 데이터를 쿼리로 호출해보겠습니다.


# GitHub

https://github.com/eonnine/MyBlog

 

eonnine/MyBlog

Spring Boot, Graphql, PostgreSQL, React-Apollo, Parcel - eonnine/MyBlog

github.com

 

댓글