Framework/Spring

[스프링] Build.Gradle & application.yml 관련 메모

simDev1234 2022. 10. 28. 14:31

1. 운영 서버와 테스트 서버의 DB 설정을 나누고 싶을 때

(1) 먼저 application.yml 에서 개발/운영 환경에 따라 DB 설정을 나눠준다.

https://1minute-before6pm.tistory.com/12

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide#profile-groups

(2) 그리고 나서 아래와 같이 Edit Configuraton의 Active prifiles를 설정한 profile 이름으로 바꾼다.

ㄴ [추가] Build.Gradle 의존성에 대한 이해

- 너무나 복잡하게 profile을 쓰고 db를 application.yml에서 나눴는데, 그럴 필요가 없단 걸 알게 됐다.

- 그냥 아래처럼 나누면 되었었다.

- implementation : 정말 라이브러리만 추가한 것을 말한다.

- runtimeOnly : 추가할 라이브러리는 런타임 시에 반드시 필요한 라이브러리임

- compileOnly : 추가할 라이브러리는 런타임 시에 반드시 필요하진 않음

* application.yml로 datasource를 통해 tomcat 또는 spring 실행 시에 사용할 db를 연결하는 것과는 다른 맥락

 

https://toss.tech/article/how-to-manage-test-dependency-in-gradle

 

테스트 의존성 관리로 높은 품질의 테스트 코드 유지하기

혹시 테스트 코드에서도 의존성을 관리해본 적이 있으실까요? 해당 포스트에서는 Gradle의 java-test-fixtures 플러그인을 사용하여 테스트 의존성 관리를 통해 높은 품질의 테스트 코드를 유지하는

toss.tech

 

 

2. 서버 메타데이터를 클래스로 뽑아서 관리하고 싶을 때

- 인증 메일을 보낼 때, 서버의 주소가 필요한데 그걸 매번 쳐주지 않고 주입시켜주려고 했다.

- application.yml에서 메타정보를 입력해서 가져올 수도 있는데, 더 우아한 방식이 있다고 해서 써봤다.

- 방법은 아래와 같이 서버를 클래스로 따로 설정해주는 것이다.

https://www.baeldung.com/spring-boot-configuration-metadata

/* 이메일 인증 시 서버 주소 필요하여 별도로 서버 설정 */
/* rf. https://www.baeldung.com/spring-boot-configuration-metadata */
@Configuration
@ConfigurationProperties(prefix = "server")
@Getter
@Setter
public class ServerPropertyConfig {

  private String name;

  private String ip = "127.0.0.1";

  private int port = 8080;

  private String address = String.format("http://%s:%d", ip, port);

}

 

3. Form 데이터를 Put/Delete로 전송할 때 Get으로 자동 변환 막기

- 이건.. 음 정확한 정보를 더 찾아봐야할 것 같다.

- 일단 알게 된 사항은 아래와 같이 hiddenmethod를 설정하면, 

  <input type = hidden> 을 통해 전달 받은 데이터를 PUT/DELETE로 처리할 수 있다는 것 정도이다. 

mvc:
  hiddenmethod:
    filter:
      enabled: true

 

4. H2 DB의 오류

[ 상황 ]

- ddl.sql과 schema.sql이 안 먹히고 datasource관련 exception이 터짐

[ 원인 ]

- 아래와 같이 schema.sql에 user를 적어두었었는데,

- H2 db의 경우 user는 내장된 예약어인지 어쩐지 어쨌든 사용하지 못하게 되어 있다고 한다.

drop table if exists user -- error

[ 해결 방법 ]

- cascade를 붙여서 작성한다.

drop table if exists "user" cascade

create table "user"
(

)

[ 그러나... ]

- 이 방법을 하게 되면 1.에서 development와 production에 따라 db vendor를 다르게 설정한게 의미가 없어진다.

- 왜냐고? production에서 나는 mysql를 쓸 건데, mysql은 또 "user"를 인식못한다. (이런..으귬느앎ㄴ;ㅣ러ㅏㅐㅂ쟛)

- 그래서 심플하게 개발단/운영단 나누어 작업하는 건 차후에 하기로 하고, 

  욕심부리지 않고 mysql만 사용하기로 했다. H2 진짜 어우 계속 화나게 하넴 ㅋㅋ