프로젝트 빌드 기본 구성

김나쁜 Kimbad·2022년 11월 2일
0

프로젝트

목록 보기
3/9

🛠️ 프로젝트 빌드

Backend for Frontend 구성도 처음에 고려해봤지만
아직 MSA 개념도 제대로 못 갖춘 상태에서 마구잡이로 시작했다가 각각 서버 관리하기가
힘들 것 같아서 회원, 업체쪽만 서버를 분리하기로 했다.

회원 서버쪽에서 회원 테이블 포함, 공통된 다른 부분을 관리하고
업체쪽 서버는 업체만 관리하는 서버로 진행한다.
이 서버의 빌드는 내가 하도록 숙제를 받았다.

📝 ERD

짤막하게 회의를 거쳐 ERD를 뽑았다. 각 테이블간 관계는 아직 설정하지 않았다.
업체 서버 <-> 회원 및 공통 서버가 각자 DB를 가지고 통신할지?
업체 서버, 회원 및 공통서버 -> DB서버로 통신하게 될지?
아마 후자쪽으로 하게 될 것 같다.

구성

Spring Boot 2.6.12 + Maven으로 프로젝트 생성을 했다.
이제 기초적으로 사용할 Dependency를 올렸다.

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를 추가했는데,
로그쪽은 나중에 한번 더 정리해서 공부해야 할 것 같다.

application.yml 설정

원래는 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 사용)

DataSource Config

@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;
    }

}

기본적인 설정에 대한 부분만 작성하고,
나머지 세부적인 부분에 대해서는 따로 작성해야겠다.

profile
Bad Language

0개의 댓글