Backend for Frontend 구성도 처음에 고려해봤지만
아직 MSA 개념도 제대로 못 갖춘 상태에서 마구잡이로 시작했다가 각각 서버 관리하기가
힘들 것 같아서 회원, 업체쪽만 서버를 분리하기로 했다.
회원 서버쪽에서 회원 테이블 포함, 공통된 다른 부분을 관리하고
업체쪽 서버는 업체만 관리하는 서버로 진행한다.
이 서버의 빌드는 내가 하도록 숙제를 받았다.
짤막하게 회의를 거쳐 ERD를 뽑았다. 각 테이블간 관계는 아직 설정하지 않았다.
업체 서버 <-> 회원 및 공통 서버가 각자 DB를 가지고 통신할지?
업체 서버, 회원 및 공통서버 -> DB서버로 통신하게 될지?
아마 후자쪽으로 하게 될 것 같다.
Spring Boot 2.6.12 + Maven으로 프로젝트 생성을 했다.
이제 기초적으로 사용할 Dependency를 올렸다.
<!--Postgresql-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.5.0</version>
</dependency>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- slf4j, log4jdbc, log4j2 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>com.googlecode.log4jdbc</groupId>
<artifactId>log4jdbc</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
<!-- Spring Validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- JSON Simple -->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<!-- Jasypt -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
Postgrsql DB
를 사용하므로 그에 대한 의존성과
JAVA에서 JSON 직/역직렬화를 편하게 하기 위해 JSON Simple
,
Backend쪽 유효성 검증을 위해 Spring Validation
및 기본적인 암호화를 위해
Jasypt
를 추가해주었다.
또한 Log 설정을 위해 slf4j, log4j2, log4jdbc를 추가했는데,
로그쪽은 나중에 한번 더 정리해서 공부해야 할 것 같다.
원래는 spring-profiles명을 통해서 환경을 지정할 수 있었는데,
2.4.x버전부터는 deprecated 되었다고 한다.
다른 방법으로는 profiles-group을 쓸 수 있다.
기본적인 application.yml
spring:
profiles:
group:
"dev" : "devdb,common"
"prd" : "prddb,common"
"local" : "localdb,common"
local
profile 실행 시 profile명이 localdb, common인 yml파일을 읽어 온다.
공통으로 쓰는 common yml
spring:
config:
activate:
on-profile: "common"
server:
port: 8020
tomcat:
uri-encoding: UTF-8
mybatis:
configuration:
jdbc-type-for-null: null
api:
charset:
- UTF-8
contentType: application/json
jasypt:
encryptor:
algorithm: PBEWithMD5ANdDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
api.*
은 JAVA에서 불러올 기본적인 설정 값을 저장해놓았고,
jaspyt
는 암호화 알고리즘과 class
에 대해서 지정했다.
profile명 localdb인 로컬 개발 환경 yml
spring:
devtools:
restart:
enabled: false
livereload:
enabled: true
config:
activate:
on-profile: "localdb"
datasource:
hikari:
# driver-class-name: org.postgresql.Driver
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
jdbc-url: "jdbc:log4jdbc:postgresql://localhost:5432/nb_comp_local"
minimum-idle: 10
maximum-pool-size: 50
username: ENC(EgYHhukh4I54oebf61kgqB+p4bDjxj/A)
password: ENC(oOhfifgwFPzfza1F+GpPbqfxzOFpmd7x)
logging:
pattern:
console: "%clr(%d{yyyy-MM-dd HH:mm:ss}){green} %clr(%-5level) %clr(${PID:-}){magenta} %clr(---){faint} [bes-neighborhood-comp] %clr(%logger - %M{36}){cyan} - %msg%n)"
level:
org:
springframework:
boot:
autoconfigure: ERROR
com:
zaxxer:
hikari:
HikariConfig: INFO
jdbc:
audit: OFF
resultset: OFF
resultsettable: DEBUG
sqlonly: DEBUG
sqltiming: DEBUG
connection: OFF
핫스왑 적용을 위해 devtools
쪽 livereload 설정.
로컬 개발 환경에서는 로그를 파일로 떨어뜨릴 필요가 없으므로 파일 쪽 설정은 안해두었다.
다만 내가 보기 쉽게 pattern.console
쪽 설정만 지정했다.
추후 배포시 로그 파일을 업체, 회원을 합칠것이기
때문에 로그 패턴에 프로젝트명을 넣어 달라는 요청을 받아서
[bes-neighborhood-comp]
라는 문구를 패턴 중간에 넣어두었다.
현재 떨어지는 로그 형태(log4jdbc 사용)
@Configuration
@MapperScan(basePackages = "bes.neighborhood.comp")
public class DatasourceConfig {
@Bean(name = "dataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public DataSource dataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage("bes.neighborhood.comp");
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/**/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean(name = "sqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "transactionManager")
public PlatformTransactionManager platformTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
기본적인 설정에 대한 부분만 작성하고,
나머지 세부적인 부분에 대해서는 따로 작성해야겠다.