헤르메스 LIFE

[Spring Boot] 게시판 #1 - 개발환경 본문

Spring Boot Framework

[Spring Boot] 게시판 #1 - 개발환경

헤르메스의날개 2023. 4. 14. 00:59
728x90

octopus_bbs.zip
0.07MB

게시판을 작성해보려 합니다. 조금씩 살을 붙여나가 보려고 합니다.


개발환경

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

 

[SpringBoot] PostgreSQL 연결하기

IDE : IntelliJ JDK : OpenJDK 11 Framework : Spring Boot 2.5.2 Database : PostgreSQL 최신버전 ( 라이센스도 소스공개의무도 없음 ) 첨부파일이 MySqlRunner 로 되어있는데.. MySQL 접속테스트 중 소스만 바뀐거라.. ㅎㅎ Do

hermeslog.tistory.com

lombok 설치

https://hermeslog.tistory.com/463

 

[Lombok] Eclipse 에 Lombok 설치 방법

Eclipse 에 lombok 설치 방법 정리합니다. IntelliJ 에서는 Plugin 으로 지원합니다. : 참조 hermeslog.tistory.com/425?category=302347 [IntelliJ] Plugins 1. Rainbow Brackets - Brackets 을 색상별로 보여줘서 예쁘게 보임. plugins

hermeslog.tistory.com


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

 

[Spring Boot] 개발환경 구축 - Hello Thymeleaf

개발환경 1. STS 버전 : 4.13.1 2. JDK 버전 : OpenJDK 11.0.14_9_x64 3. Tomcat 버전 : 9.0.71 4. Maven 버전 : 3.8.4 5. Spring 버전 : Spring Boot 2.7.8 6. Thymeleaf 3.0.15 pom.xml 4.0.0 org.springframework.boot spring-boot-starter-parent 2.7.8 sim

hermeslog.tistory.com

https://hermeslog.tistory.com/588

 

[Spring Boot] Spring Boot + Thymeleaf

개발환경 1. STS 버전 : 4.13.1 2. JDK 버전 : OpenJDK 11.0.14_9_x64 3. Tomcat 버전 : 9.0.56 4. Maven 버전 : 3.8.4 5. Spring 버전 : Spring Boot 2.6.3 6. Database : Docker 에 DB 설치 - primary - PostgreSQL 13.3 7. Spring Security : 5.6.1 8. lo

hermeslog.tistory.com

https://hermeslog.tistory.com/703

 

[WARN] Cannot find template location: classpath:/templates/

게시판을 작성해보려 합니다. 조금씩 살을 붙여나가 보려고 합니다. 개발환경 Spring Boot 2.7.9 lombok devtools postgresql Gladle Thymeleaf 아래와 같은 경고가 발생했습니다. 2023-04-12T23:16:10.277+09:00 

hermeslog.tistory.com

 

728x90