Document Page
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 λ₯Ό μμ±νμ¬ μ€ννλ©΄ λ°λ‘ ν μ€νΈ λ° μ€νμ΄ κ°λ₯νλ€.
κ° λ΄μ©λ€μ κΉνμ μ 리νμ¬ μ¬λ €λμλ€.
무μΈκ° λ°λ‘λ°λ‘ νλ‘μ νΈλ₯Ό μμ±νμ¬ μ§ννκ³ μΆμ λ, μ΄λ° ν΅ μ€νν μ΄ κ°λ₯ν μ±λ‘ μΈν μ΄ λμ΄μμΌλ©΄ μ’κ² λ€κ³ μκ°ν΄μ μ΄λ° λ΄μ©λ€μ μ 리ν λλ§λ€ κΉνμ μ¬λ €λκ³ μ°λ©΄ μ’μ κ² κ°λ€.
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