harry.93 2021. 9. 20. 22:59
λ°˜μ‘ν˜•

1. κ°œμš”

1. ν•„μš”μ„± 

ν•¨μˆ˜λ‚˜, 기타 정리가 ν•„μš”ν•œ 뢀뢄이 생겼을 λ•Œ, 보톡 λ¬Έμ„œλ‚˜ μŠ€ν”„λ ˆλ“œ μ‹œνŠΈμ— μ €μž₯ν•˜λŠ” 것이 λ³΄ν†΅μ΄μ—ˆλŠ”λ° 이렇닀 λ³΄λ‹ˆ μ²΄κ³„μ μœΌλ‘œ 정리가 λ˜μ§€ μ•Šμ„ λΏλ”λŸ¬, μ°ΎκΈ°κ°€ νž˜λ“€κ³  ν‰μ†Œμ— μ–΄λ–€ λ‚΄μš©μ΄ 담겨져 μžˆλŠ”μ§€ 확인이 λΆˆκ°€λŠ₯ ν•˜μ˜€λ‹€. 개인적인 μš©λ„λ‚˜ ν˜Ήμ€ 사내에 κ³΅μœ ν•˜κΈ° μœ„ν•œ  API Developer Document 처럼 정리할 수 μžˆλŠ” μ„œλΉ„μŠ€κ°€ 있으면 μ’‹κ² λ‹€κ³  μƒκ°ν•˜μ˜€λ‹€.

 

2. λͺ©μ 

λͺ©μ μ€ ν•„μš”μ„±κ³Ό 같은 λ§₯락으둜, 정리가 ν•„μš”ν•œ ν•¨μˆ˜λ‚˜ 기타 클래슀 등을 μ •λ¦¬ν•˜μ—¬ λΉ λ₯΄κ²Œ λ‚΄λΆ€ μΈμ›μ—κ²Œ κ³΅μœ ν•˜κ±°λ‚˜ μ™ΈλΆ€ μΈμ›μ—κ²Œ κ³΅μœ κ°€ κ°€λŠ₯ν•˜λ„λ‘ ν”„λ‘œμ νŠΈ 별 ν˜Ήμ€ ν”„λ ˆμž„μ›Œν¬ λ³„λ‘œ μ •λ¦¬λœ λ¬Έμ„œλ₯Ό μž‘μ„± 및 곡유 ν•˜κΈ° μœ„ν•¨μ΄λ‹€.

 

3. μ‚¬μš© 기술 μŠ€νƒ

Front : HTML & Vue.js

Back : Spring Boot Framework + Gradle

DB : RDB ( MYSQL / ORACLE ) or etc.

 

4. μ„œλΉ„μŠ€ ꡬ쑰 (μ΄ˆμ•ˆ)

Spring Boot Framework ꡬ성 μ‹œ, νŠΈλžœμž­μ…˜κ³Ό μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° μ •λ„λŠ” ν¬ν•¨ν•˜μ—¬ κ΅¬μ„±ν•˜λ €κ³  생각 쀑이닀.

λ˜ν•œ 둜그 처리 같은 기본적인 뢀뢄도 Boot Project λŠ” 처음이라 κ³΅λΆ€ν•˜λ©΄μ„œ μ§„ν–‰ν•  μ˜ˆμ •μ΄λ‹€.

 

κ·Έ 외에 μΆ”κ°€μ μœΌλ‘œ μ„œλΉ„μŠ€λ₯Ό SPA λ°©μ‹μœΌλ‘œ ꡬ성을 ν• κΉŒ 생각 쀑인데, μ μš©μ„ ν•  수 μžˆμ„ μ§€ μ˜λ¬Έμ΄λ‹€.

μœ„ κ°œλ…μ„ κ°€μ§€κ³  μ ‘κ·Όν•΄λ³Ό 생각이며, 화면섀계 λΆ€ν„° μ°¨κ·Όμ°¨κ·Ό μ§„ν–‰ν•΄λ³Ό μ˜ˆμ •μ΄λ‹€.

 

2. κ°„λ‹¨ν•œ ν™”λ©΄ 섀계

κ°„λ‹¨ν•˜κ²Œ μƒκ°λ‚¬λ˜ 아이디어 및 ν™”λ©΄ λ‚΄μš©μ„ κ°„λ‹¨ν•˜κ²Œ νŒŒμ›Œν¬μΈνŠΈλ‘œ μ„€κ³„ν•΄λ³΄μ•˜λ‹€.

μΆ”ν›„ μ§„ν–‰ λ˜λŠ” ν•œλ²ˆ 더 λ³΄λ©΄μ„œ μˆ˜μ •ν•΄ λ‚˜κ°ˆ μ˜ˆμ •μ΄λ‹€.

 

3. Spring Boot 기반 ν”„λ‘œμ νŠΈ μ§„ν–‰

ν”„λ‘œμ νŠΈμ— DBλ₯Ό 연동해야 ν•΄μ„œ, 고민을 ν•΄λ³Έ κ²°κ³Ό ...

μ €μž₯될 데이터가 λ§Žμ§€ μ•Šκ³ , ν…Œμ΄λΈ”λ„ 많이 ν•„μš”ν•œκ²Œ μ•„λ‹ˆλΌμ„œ No SQL μͺ½μ„ μ•Œμ•„λ³΄μ•˜λŠ”λ° 사싀상 μš”κΈˆλ¬Έμ œκ°€ μžˆμ–΄μ„œ μ–΄λŠμ •λ„ ν…ŒμŠ€νŠΈμ™€ κ°„λ‹¨ν•œ κ΅¬ν˜„ λŠλ‚ŒμœΌλ‘œ μ§„ν–‰ν•˜λŠ”λ°μ—λŠ” μ ν•©ν•˜μ§€ μ•Šμ€ 것 κ°™μ•„ RDBλ₯Ό κ·Έλƒ₯ μ—°λ™ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€.

DBλŠ” ORACLE 이며, μš°μ„  ORACLE 둜 μ—°κ²° λ˜λŠ” 뢀뢄을 확인 후에, MYSQL κΉŒμ§€ 연동 κ°€λŠ₯ν•˜κ²Œ μˆ˜μ •ν•  μ˜ˆμ •μ΄λ‹€.

μš°μ„ , ν”„λ‘œμ νŠΈ ν™˜κ²½μ€ λ‹€μŒκ³Ό κ°™λ‹€.

- JDK11
- Spring Boot

기본적으둜 vscode extension μ—μ„œ μƒμ„±ν•˜λŠ” λΆ€νŠΈ ν”„λ‘œμ νŠΈλ₯Ό 기본적으둜 μ‚¬μš©ν•˜μ˜€λ‹€.

DB ν™˜κ²½μ€ HikariCPλ₯Ό μ΄μš©ν•˜μ—¬ Oracle κ³Ό Connection 을 λ§Ίκ³ , log4j λ₯Ό 톡해 DB 둜그λ₯Ό 좜λ ₯ν•˜λŠ” κ²ƒμœΌλ‘œ ν•˜μ˜€λ‹€. 그리고, DB mapper 연동은 MyBatis λ₯Ό 톡해 μ§„ν–‰ν•œλ‹€.

 

1. ν•„μš” Dependency μΆ”κ°€.

// https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter
implementation group: 'org.mybatis.spring.boot', name: 'mybatis-spring-boot-starter', version: '2.1.4'
	
// log4j2
implementation group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.1', version: '1.16'   

// https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8
implementation group: 'com.oracle.database.jdbc', name: 'ojdbc8', version: '21.1.0.0'

DB 컀λ„₯μ…˜μ„ μœ„ν•΄μ„œλŠ” ojdbc λ˜ν•œ ν•„μš”ν•˜λ‹€. λ²„μ „λ§ˆλ‹€ μ§€μ›ν•˜λŠ” JDK 버전이 λ‹€λ₯΄λ‹ˆ 확인이 ν•„μš”ν•˜λ‹€.

 

2. application.yml μž‘μ„±

보톡 ν”„λ‘œμ νŠΈ 생성 ν›„μ—λŠ” application.properties 둜 λ˜μ–΄μžˆμ§€λ§Œ, 편의λ₯Ό μœ„ν•΄ yml 파일둜 λ°”κΎΈμ—ˆλ‹€. κ·ΈλŒ€λ‘œ properties 둜 진행해도 상관 μ—†μœΌλ‚˜, ν‘œκΈ°λ²•μ΄ λ‹€λ₯΄λ‹€.

# /resource/application.yml 

spring:
    application:
        name: springboot-project-name

    # DB Connection 
    datasource:
        hikari:
            jdbc-url: jdbc:log4jdbc:oracle:thin:@{oracle-db-url} # ex ) localhost:3306:utf8
            driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
            username: {user-name}
            password: {user-password}
            maximum-pool-size: {connection-pool-size}

DBμ—°κ²° 정보λ₯Ό μž‘μ„±ν•œλ‹€. 

 

3. log4j properties μž‘μ„±

log4j ν”„λ‘œνΌν‹°λ₯Ό μž‘μ„±ν•œλ‹€. μžμ„Έν•œ 건 λͺ¨λ₯΄κ² μœΌλ‚˜, 보톡 μ΄λ ‡κ²Œ μ„ΈνŒ…ν•˜κ³  μ¨μ„œ κ·ΈλŒ€λ‘œ κ°€μ Έμ™”λ‹€.

# /resource/log4j. log4jdbc.log4j2.properties.yml 

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

#Disable - Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
log4jdbc.auto.load.popular.drivers = false

 

4. logback μž‘μ„±

둜그λ₯Ό μ–΄λ–€ ν˜•μ‹μœΌλ‘œ μ–΄λ–»κ²Œ 좜λ ₯ν•  것이며, 둜그 λ ˆλ²¨μ„ μ§€μ •ν•œλ‹€.

# /resource/logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<layout class="ch.qos.logback.classic.PatternLayout">
			<Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
		</layout>
	</appender>
	<appender name="SAMPLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
		</encoder>
	</appender>

	<logger name="{project-package-dir}" level="DEBUG" additivity="false">
		<appender-ref ref="SAMPLE" />
	</logger>
	<root level="INFO">
		<appender-ref ref="STDOUT" />
	</root>
	<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" />
</configuration>

 

5. mybatis config μž‘μ„±

Mybatis 섀정을 μž‘μ„±ν•œλ‹€. ν•„μš”ν•œ μ˜΅μ…˜λ§Œ κ²€μƒ‰ν•˜μ—¬ μž‘μ„±ν•˜μ˜€λ‹€.

# /resource/mybatis/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <settings>
    <setting name="mapUnderscoreToCamelCase" value="true" />
    <!-- column이 NULL 일 κ²½μš°μ—λ„ 좜λ ₯ -->
    <setting name="callSettersOnNulls" value="true" />
    <!-- rowκ°€ NULL 일 κ²½μš°μ—λ„ 좜λ ₯ -->
    <setting name="returnInstanceForEmptyRow" value="true" />
  </settings>
</configuration>

 

6. DB config java 파일 μž‘μ„±

μ‹€μ œλ‘œ 컀λ„₯μ…˜ μ‹œ, μ‚¬μš©ν•  DataSource 와 Sql Session Template 을 μ‚¬μš©ν•˜λ„λ‘ μž‘μ„±ν•œλ‹€.

mapper 와 μ„€μ • 파일 경둜λ₯Ό μ§€μ •ν•˜μ—¬ 뢈러였고 찾을 수 μžˆλ„λ‘ ν•œλ‹€.

# {package-dir}/config/DBconfig.java

import javax.sql.DataSource;

import com.zaxxer.hikari.HikariDataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan(basePackages = "{repositoey-dir}")
public class DatabaseConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.hikari")
    public DataSource dataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
        Resource myBatisConfig = new PathMatchingResourcePatternResolver()
                .getResource("classpath:mybatis/mybatis-config.xml");
        sessionFactory.setConfigLocation(myBatisConfig);

        return sessionFactory.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
        final SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
        return sqlSessionTemplate;
    }
}

 

μ—¬κΈ°κΉŒμ§€ μž‘μ„±ν•˜κ³ , 각 Service 와 Repository λ₯Ό μž‘μ„±ν•˜μ—¬ μ‹€ν–‰ν•˜λ©΄ λ°”λ‘œ ν…ŒμŠ€νŠΈ 및 싀행이 κ°€λŠ₯ν–ˆλ‹€. 

각 λ‚΄μš©λ“€μ€ 깃헙에 μ •λ¦¬ν•˜μ—¬ μ˜¬λ €λ†“μ•˜λ‹€. 

무언가 λ°”λ‘œλ°”λ‘œ ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•˜μ—¬ μ§„ν–‰ν•˜κ³  싢을 λ•Œ, 이런 퀡 μŠ€νƒ€νŒ…μ΄ κ°€λŠ₯ν•œ μ±„λ‘œ μ„ΈνŒ…μ΄ λ˜μ–΄μžˆμœΌλ©΄ μ’‹κ² λ‹€κ³  μƒκ°ν•΄μ„œ 이런 λ‚΄μš©λ“€μ„ 정리할 λ•Œλ§ˆλ‹€ 깃헙에 μ˜¬λ €λ†“κ³  μ“°λ©΄ 쒋을 것 κ°™λ‹€. 

https://github.com/Chiptune93/Library/tree/main/Spring/QuickStart/SpringBoot/JDK11/Mybatis%2BHikariCP%2BOracle

 

GitHub - Chiptune93/Library: My Java Util Class

My Java Util Class. Contribute to Chiptune93/Library development by creating an account on GitHub.

github.com

 

4. ν”„λ‘œμ νŠΈ μ™„μ„± 및 μš΄μ˜ν™˜κ²½ κ²°μ •

ν”„λ‘œμ νŠΈ κΈ°λŠ₯ ꡬ성을 끝내고, 퍼블 μž‘μ—…μ„ λΆ€νƒν–ˆλ‹€. 생각보닀 μ‹¬ν”Œν•˜κ²Œ λ‚˜μ™€μ„œ ν™”λ©΄ 섀계 만큼 λ³΅μž‘ν•˜κ²Œ κ΅¬μ„±ν•˜μ§€ μ•Šμ•„λ„ λ˜μ—ˆκ³ 

둜그인 같은 κΈ°λŠ₯도 λΉΌκ³  λŒ€μ‹  관리 κΈ°λŠ₯의 λ³€ν™˜μ„ ν‚€λ³΄λ“œ μž…λ ₯을 톡해 ν•˜κΈ°λ‘œ ν–ˆλ‹€.

 

이런 μ‹μœΌλ‘œ νŽ˜μ΄μ§€λŠ” 완성이 λ˜μ—ˆκ³ , 이λ₯Ό 이제 μ–΄λ–»κ²Œ μš΄μ˜ν•  것인가에 λŒ€ν•œ λ¬Έμ œκ°€ λ‚¨μ•˜μ—ˆλ‹€.

졜근, ν”„λ‘œμ νŠΈ ν•˜λ‚˜λ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ Dockerλ₯Ό Study ν•˜κΈ°λ„ ν–ˆκ³ , νšŒμ‚¬ λ‚΄λΆ€μ—μ„œλ„ 이λ₯Ό μœ„ν•œ μ„œλ²„λ₯Ό ν•˜λ‚˜ λ§ˆλ ¨ν•œ μƒνƒœμ˜€λ‹€. λ”°λΌμ„œ, λ‚˜λŠ” 이 ν”„λ‘œμ νŠΈλ₯Ό Docker 이미지화 ν•˜μ—¬ Docker μ„œλ²„μ— 올렀 μš΄μ˜ν•˜κΈ°λ‘œ ν–ˆλ‹€. 그리고 DB λ˜ν•œ 졜근 μ§„ν–‰ν•œ ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•œ Postgresql 을 μ‚¬μš©ν•˜κΈ°λ‘œ ν•˜κ³  이것 λ˜ν•œ, μ„œλ²„μ— μ˜¬λ €λ†“κ³  μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆλ‹€.

κ°„λ‹¨ν•˜κ²Œ μ„œλ²„μ—μ„œ μž‘μ—…ν•œ λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™μ•˜λ‹€.

1. Docker & Docker Compose μ„€μΉ˜.

2. Docker Image pull λ°›κΈ° > Postgresql, λ§Œλ“  ν”„λ‘œμ νŠΈμ˜ image

3. Docker run으둜 run μ‹œν‚€κΈ°.

 

- Dockerfile

FROM adoptopenjdk/openjdk11
EXPOSE 8080:8080
ARG WAR_FILE=build/libs/api.war
COPY ${WAR_FILE} api.war
ENTRYPOINT [ "java", "-jar", "/api.war" ]

 

λ‹¨μˆœν•˜κ²Œ war둜 말린 이미지λ₯Ό run ν•˜λŠ” 것이닀.

- μ‚¬μš©ν•œ Command

1. build

docker build -t api:1.0 .

2. docker run

docker run -d -p 8080:8080 --name syworks-api api:1.0

3. docker push

docker push api:1.0

 

이둜써 λ­”κ°€ λΉ λ₯΄κ²Œ λΉ λ₯΄κ²Œ 첫 Spring Boot + Vuejs ν”„λ‘œμ νŠΈλŠ” Docker기반으둜 μš΄μ˜ν•˜κΈ°λ‘œ ν•˜λŠ” λ°”λžŒμ— 생각보닀 금방 λλ‚˜κ²Œ λ˜μ—ˆλ‹€.

μΆ”κ°€μ μœΌλ‘œ, 이번 ν”„λ‘œμ νŠΈλ₯Ό μš΄μ˜μ— μ˜¬λ¦¬λ©΄μ„œ nginxλ₯Ό μ˜¬λ €μ„œ μ—¬λŸ¬κ°œ ν”„λ‘œμ νŠΈλ₯Ό μš΄μ˜ν•  수 있게 ν•˜λŠ” 것을 λ‚΄λΆ€μ—μ„œ μ œμ•ˆν•˜μ…”μ„œ 그것도 κ³ λ €ν•΄λ³΄κ²Œ λ˜μ—ˆλ‹€. μ•„λ§ˆ λ‹€μŒλ²ˆ 개인 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜κ²Œ λœλ‹€λ©΄ 고렀해보아야 κ² λ‹€.

 

5. μ™„λ£Œ 및 곡유 

https://github.com/Chiptune93/DocumentsPage

 

GitHub - Chiptune93/DocumentsPage

Contribute to Chiptune93/DocumentsPage development by creating an account on GitHub.

github.com

 

ν•΄λ‹Ή ν”„λ‘œμ νŠΈλŠ” 개발 μ’…λ£Œ ν•˜κ³ , λ‹€μŒ ν”„λ‘œμ νŠΈλ₯Ό κ΅¬μƒν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€ :D

728x90
λ°˜μ‘ν˜•