티스토리 뷰
# PostgreSQL 설치
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
상단 링크로 가서 자신의 운영체제에 맞는 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에서 설정 가능한 프로퍼티들이 궁금하다면 아래 링크에서 확인하세요.
@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
'프로젝트 > 나만의 블로그' 카테고리의 다른 글
React & Parcel 개발 환경 구성 [FE] (0) | 2019.08.24 |
---|---|
Spring Boot & GraphQL (2) [BE] (2) | 2019.08.18 |
Spring Boot & GraphQL (1) [BE] (0) | 2019.08.18 |
Spring Boot 개발 환경 구성 [BE] (0) | 2019.08.18 |
[나만의 블로그]시작 (0) | 2019.08.16 |
- Total
- Today
- Yesterday
- graphql
- Apollo
- Jenkins
- typescript
- 프로그래머스[정렬]
- CI
- 동적계획법
- 프로그래머스[Lv1]
- Spring Boot
- Kubernetes
- 프로그래머스[해시]
- 프로그래머스
- CRP 최적화
- javascript
- 프로그래머스[힙]
- execution context
- 실행 문맥
- Nashorn
- 웹 사이트 최적화
- 알고리즘
- 프로그래머스[스택/큐]
- Web
- PostgreSQL
- react
- Handshake
- CD
- Pipeline
- Docker
- JPA
- 프로그래머스[이분탐색]
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |