250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- myBatis
- error
- spring
- Tomcat
- ubuntu
- git
- 문서
- maven
- MSSQL
- Thymeleaf
- Source
- JavaScript
- PostgreSQL
- jpa
- Eclipse
- STS
- Docker
- oracle
- JDBC
- IntelliJ
- MySQL
- Spring Boot
- Open Source
- 설정
- Exception
- 오픈소스
- Python
- SpringBoot
- AJAX
- Core Java
Archives
- Today
- Total
헤르메스 LIFE
[Spring Boot] 게시판 #1 - 개발환경 본문
728x90
게시판을 작성해보려 합니다. 조금씩 살을 붙여나가 보려고 합니다.
개발환경
STS 4.17.2.RELEASE
OpenJDK Runtime Environment Zulu11.62+17-CA (build 11.0.18+10-LTS)
Spring Boot 2.7.9
lombok
devtools
postgresql 14.1
Gladle
Thymeleaf
src/main/resources/templates 폴더 추가 생성
src/main/resources/static 폴더 추가 생성
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
인덱스 페이지 입니다.
</body>
</html>
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.10'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'octopus'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
// Default : 2.7.10
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.postgresql:postgresql'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
Postgresql 연결
https://hermeslog.tistory.com/541
lombok 설치
https://hermeslog.tistory.com/463
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.10'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'octopus'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
// Default : 2.7.10
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
// Default : 2.0.0.RELEASE
implementation 'org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE'
// Model Mapper 라이브러리 추가
implementation 'org.modelmapper:modelmapper:2.4.2'
// jpa query logging
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.1'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.postgresql:postgresql'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
application.yml
##############################################################
# Server port
server:
servlet:
context-path: /
encoding:
enabled: true
charset: UTF-8
force: true
session:
timeout: 18000 # 30분, Default 기본단위 : 초
tomcat:
uri-encoding: UTF-8 # Spring Default : UTF-8
##############################################################
# -Dspring.profiles.active=local
spring:
profiles:
include: local
##############################################################
# Spring Message 처리
messages:
basename: messages/messages, messages/exception # 각각 ResourceBundle 규칙을 따르는 쉼표로 구분된 기본 이름 목록
always-use-message-format: false # 인수가 없는 메시지도 구문 분석하여 항상 MessageFormat 규칙을 적용할지 여부
encoding: UTF-8
fallback-to-system-locale: true # locale에 해당하는 file이 없을 경우 system locale을 사용 ( default : true )
use-code-as-default-message: true # 해당 코드를 찾을 수 없을 경우 Code 를 출력한다. ( default : false )
cache-duration: 3 # default는 forever
#cache-seconds: -1 # 로드된 자원 번들 파일 캐시 만료(초). -1로 설정하면 번들은 영원히 캐시됩니다.
##############################################################
# Swagger pathmatch
# spring.mvc.pathmatch.matching-strategy=ant_path_matcher
mvc:
pathmatch:
matching-strategy: ant-path-matcher
application-local.yml
# Server port
server:
port: 9090
##############################################################
# Spring Message 처리
spring:
config.activate.on-profile: local
devtools:
livereload:
enabled: true
jpa:
open-in-view: false
#database-platform: org.hibernate.dialect.PostgreSQLDialect
#show-sql: true # System.out 으로 출력. logging.level.org.hibernate.SQL=debug 로 대체합니다.
hibernate:
# create : entity를 drop cascade 하고 다시 생성
# update : entity가 수정되면 수정된 내용만 반영
# create-drop,validate, none
# 하이버네이트가 자동으로 생성해주는 DDL은 신뢰성이 떨어지기 때문에
# 절대로! 운영DB 환경에서 그대로 사용하면 안되고, 직접 DDL을 작성하는 것을 권장
ddl-auto: none
##############################################################
# Spring Database 처리
datasource:
#driver-class-name: org.postgresql.Driver
#url: jdbc:postgresql://localhost:5432/springboot
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:postgresql://localhost:5432/springboot
username: hermeswing
password: pass
#sql-script-encoding: utf-8 # springboot 1.5.x - Deprecated!
##############################################################
# - 경로 : /src/main/resources 경로 하위
# - schema.sql : 테이블 생성 스크립트
# - data.sql : 데이터 입력 스크립트
# - 파일이름규칙 : schema-${platform}.sql , data-${platform}.sql
# ex. schema-h2.sql , shcema-postgres.sql
#spring.datasource.initialization-mode=always # Spring Boot <v2.5.x
# DB초기화(schema.sql, data.sql) , [always : 기동 시 매번 동작, never : 기동 시 동작하지 않음]
sql:
init:
schema-locations: classpath*:initdata/schema-postgresql.sql
data-locations: classpath*:initdata/data-postgresql.sql
mode: always # Spring Boot >=v2.5.0
encoding: UTF-8 # Spring Boot >=v2.5.0
# Logging
logging:
level: # 각 package 별로 로깅 레벨을 지정할 수 있다.
root : INFO
octopus: DEBUG
org:
springframework: INFO
pattern:
console: "%-5level %d{yy-MM-dd HH:mm:SSS}[%thread] %boldMagenta([▶ %logger.%method ◀])[%line]: - %msg%n"
file: "%-5level %d{yy-MM-dd HH:mm:SSS}[%thread] %logger.%method[%line]: - %msg%n"
level: "[%X{FUNCTION_NAME}:%X{X-Track-Id}:%X{LOGIN_USER_ID}] 5p%"
file:
name: /Octopus/logs/app_log.log # 로깅 파일 위치이다.
logback:
rollingpolicy:
max-file-size: 100MB #default 10M 로그 파일 하나당 최대 파일 사이즈이다.
#max-history: 31 #default 7 로그 파일 삭제 주기이다. 7일 이후 로그는 삭제한다.
max-history: 1 #default 7 로그 파일 삭제 주기이다. 7일 이후 로그는 삭제한다.
file-name-pattern: app_log.%d{yyyy-MM-dd}.%i.gz
# p6spy 를 위한 설정
decorator.datasource.p6spy.enable-logging: true # false : Disable p6spy
logback-local.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- 로그 파일이 저장될 경로 -->
<property name="LOG_PATH" value="C:/Octopus/logs" />
<!-- pattern -->
<property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:SSS}[%thread] %30logger[%method:%line] - %msg%n" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="ROLLING-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE_DEV}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- Rolling 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
<fileNamePattern>${LOG_PATH}/${LOG_FILE_DEV}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 파일당 최고 용량 kb, mb, gb -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거 -->
<maxHistory>1</maxHistory>
</rollingPolicy>
</appender>
<logger name="org.springframework.orm.jpa.JpaTransactionManager" level="DEBUG" additivity="false"/>
<logger name="octopus" level="debug" additivity="false">
<!-- ref="appender name 지정" -->
<appender-ref ref="CONSOLE" />
<!-- <appender-ref ref="ROLLING-FILE" /> -->
</logger>
<root level="debug">
<appender-ref ref="CONSOLE" />
<!-- <appender-ref ref="ROLLING-FILE" /> -->
</root>
</configuration>
spy.properties
appender = com.p6spy.engine.spy.appender.Slf4JLogger
#driverlist = org.h2.Driver, org.postgresql.Driver
driverlist = org.postgresql.Driver
logMessageFormat = com.p6spy.engine.spy.appender.MultiLineFormat
schema-postgresql.sql
DROP TABLE IF EXISTS T_BBS_M;
CREATE TABLE IF NOT EXISTS T_BBS_M (
ID SERIAL NOT NULL,
TITLE VARCHAR(200) NOT NULL,
CONTENTS TEXT NOT NULL,
READ_CNT INTEGER NOT NULL DEFAULT 0 ,
CRT_ID VARCHAR(20),
CRT_DT TIMESTAMP,
MDF_ID VARCHAR(20),
MDF_DT TIMESTAMP,
CONSTRAINT PK_BBS_M PRIMARY KEY (ID)
);
data-postgresql.sql
COMMENT on column T_BBS_M.ID is 'ID';
COMMENT on column T_BBS_M.TITLE is ' 제목 ';
COMMENT on column T_BBS_M.CONTENTS is ' 내용 ';
COMMENT on column T_BBS_M.READ_CNT is ' 조회수 ';
COMMENT on column T_BBS_M.CRT_ID is '생성자ID';
COMMENT on column T_BBS_M.CRT_DT is '생성일시';
COMMENT on column T_BBS_M.MDF_ID is '수정자ID';
COMMENT on column T_BBS_M.MDF_DT is '수정일시';
INSERT INTO T_BBS_M(TITLE, CONTENTS, READ_CNT, CRT_ID, CRT_DT, MDF_ID, MDF_DT) VALUES ('테스트', '한글 테스트', 0, 'admin', NOW(), 'admin', NOW());
https://hermeslog.tistory.com/662
https://hermeslog.tistory.com/588
https://hermeslog.tistory.com/703
728x90
'Spring Boot Framework' 카테고리의 다른 글
[Spring Boot] 게시판 #3 - 게시판 목록 + 페이징처리 (0) | 2023.04.25 |
---|---|
[Spring Boot] 게시판 #2 - 간단한 게시판 CRUD 개발 (0) | 2023.04.23 |
[Spring Boot] HandlerMethodArgumentResolver를 이용한 중복 Source 제거 방법 (0) | 2023.04.04 |
[Spring Boot] Jackson 직렬화 문제 (0) | 2023.04.01 |
[Swagger] API 문서 자동화 설정 (0) | 2023.03.30 |