728x90

Backend 150

[SpringBoot] JPA+Kotlin 다중 DB 설정

일반적으로 DB서버 master를 하나두고 slave는 여러개를 두고 사용한다. master는 쓰기 작업만 처리하고 slave는 master 에 등록된 데이터가 동기화 되어 읽기 작업만 수행하도록 한다. 가장 간단한 방법은 서버 url 설정시 아래와 같이 jdbc:mysql:replication 스키마를 이용하는 것이다. jdbc:mysql:replication://master,slave1,slave2,slave3/test 이 경우 readOnly=false 일 경우 master로 연결되고 readOnly=true 일 경우 slave1, slave2, slave3 중 랜덤으로 선택되어 연결된다. 하지만 jdbc:mysql:replication 스키마를 사용할 경우 master 서버 커넥션에 문제가 발생할..

Backend/Spring+Boot 2021.12.09

[JPA] EntityManager

JPA가 아닌 환경에서 api호출과 DB수정이 함께 필요한 로직이 있다고 가정해보자. 트랜잭션 단위로 완벽하게 묶을 순 없지만 DB수정 -> api 호출 과 같은 순서로 진행하도록 해 놓으면 api 호출에 문제가 있을 경우 RuntimeException 을 발생시켜서 DB수정을 롤백하면 된다. 하지만 JPA 환경에서는 이게 불가능하다. JPA 는 flush 단계에서 실제 DB로 쿼리를 날리고 flush는 트랜잭션이 종료된 시점에 commit 과 함께 수행되기 때문에 쿼리가 정상인지 여부를 기본적으로 트랜잭션이 종료되는 시점(일반적으로 메소드가 정상 종료된 시점)에 알 수 있다. 이에 트랜잭션으로 묶인 메소드에서 단순히 DB수정 -> api 호출 과 같은 순서로 진행하도록 구성을 해놓을 경우 DB수정 쿼리..

Backend/JPA 2021.12.08

[JPA] SpringBoot JPA 설정

우선 SpringBoot 에서 JPA 설정을 위해 서칭을 하다보면 많은 javaConfig 로 여러 셋팅을 하는 포스팅이 나오지만 그 대부분은 Spring 기준으로 작성된 것이고 SpringBoot 에서는 대부분 자동으로 처리를 해주기 때문에 필요없는 것들이 더 많다. Spring 환경에서는 javaConfig 방식으로 Datasource 빈을 만들어서 이걸 기반으로 EntityManagerFactory 빈을 만들고 또 다시 이걸 기반으로 TransactionManager 빈을 만든다. 추가로 @EnableTransactionManagement 도 추가해서 어노테이션으로 트랜잭션을 관리할 수 있도록 해줘야 한다. 아래 포스팅은 이에 대한 가장 정석적인 내용이다. http://www.devkuma.com/..

Backend/Spring+Boot 2021.12.08

[Kotlin] 제네릭(내가 필요한 것만 정리..)

타입 파라미터와 타입 인자 제네릭 클래스나 함수를 정의할 때에는 T 같은 것들을 타입 파라미터라 하고 객체를 생성하거나 함수를 호출할 때 지정하는 실제 타입을 타입인자라고 부른다. 자바에서는 제네릭 타입을 선언할 때 타입 파라미터나 인자가 없는 raw 타입을 허용하는데 예를 들어 List를 선언할 때를 생각해볼 수 있다. List list = new ArrayList(); 하지만 코틀린에서는 이렇게 선언할 수 없으며 아래와 같이 반드시 타입 파라미터 또는 인자를 지정해야 한다. 자바는 제네릭을 1.5 버전 부터 도입했기 때문에 하위 호환성을 위해 raw 타입을 허용하지만 코틀린은 처음부터 제네릭을 지원했기 때문에 타입 인자를 반드시 정의해야 한다. //타입 파라미터 지정 var list: List = m..

Backend/Kotlin 2021.12.06

[Kotlin] inline

고차함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수이다. 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있다. 그런데 내부적으로 이게 실제로 사용될 때 내부적으로 Function 이라는 인터페이스를 구현한 객체를 생성해서 사용하게 된다. 예를 들어 아래와 같은 코드가 있다면 1 2 3 4 5 6 7 8 fun testFunc(a: Int, b: Int, body: (Int, Int) -> Int): Int { return body(a, b) } @Test fun test() { println(testFunc(2, 3) { a, b -> a + b }) } Colored by Color Scripter cs 컴파일 단계에서 아래와 같이 변환된다. 1 2 3 4 5 6 7 8 9 f..

Backend/Kotlin 2021.12.06

Mapstruct 주의사항

Mapstruct vo, dto, entity 간 변환을 쉽게 할 수 있도록 해준다. 사실 전에는 클래스마다 static of 메소드를 만들어서 변환시 마다 빌더를 직접 코딩했는데 payload 방대할 경우 이게 참 못할 짓이다. 일반적으로 로직을 고민하는 시간이 코드를 작성하는 시간보다 훨씬 오래 걸리는데 방대한 payload 에 대해 빌더를 직접 코딩하다보면 반대 상황에 놓이게 되고 하나의 오타가 반나절을 잡아먹기도 한다. Mapstruct 대한 예제는 정말 많으니 그걸 참고하도록 하고 여기에서는 주의사항에 대해 기록하고자 한다. 사람마다 다르겠지만 나는 request 데이터를 매핑하는 vo 클래스는 immtable 로 만드는 것을 선호한다. 클래스를 immtable로 만드는 방법은 간단하다. 생성자..

Backend/Spring+Boot 2021.11.30

[Kotlin] 코틀린에서 유틸함수 만들기

자바에서는 유틸성 함수를 만들 때 특정 클래스에 static 메소드를 정의해놓고 사용하곤 한다. 반복적으로 자주 사용되는 함수이기 때문에 별도의 객체 생성 단계 없이 메모리 상주시켜 사용하기 위함이다. 코틀린에서는 유틸성 함수를 만드는데 세 가지 방법을 제공하는데 object, companion object, top-level-function 를 활용한다. 우선 세 가지 방식 모두 자바로 디컴파일 해보면 static 자원이다. top-level-function 은 자바에서 흔하게 사용하던 유틸 메소드와 같이 class 에 static 메소드로 정의된다. object, companion object 는 객체 자체가 static 변수에 할당되는데 모두 어플리케이션 실행시 클래스 로더에 의해 초기화 된다. 차..

Backend/Kotlin 2021.11.24

[Kotlin] val, const val

코틀린에서 상수를 선언하는 방법은 두가지로 변수 선언 앞에 val 또는 const val 를 사용하는 것이다. val의 값은 런타임 시 할당되고 const val 은 컴파일 시 할당된다. val 은 자바의 final 이라고 생각하면 되고 const는 자바의 static final 이라고 생각하면 된다. 이에 val 와 달리 const val 은 객체 생성이 필요없는 최상위 함수나 싱글톤 형태의 object 또는 static 과 비슷한 companion object 에서만 정의할 수 있다. 또한 const val 에는 함수나 객체는 할당할 수 없고 String 같은 기본타입만 할당할 수 있다. val 로 할당한 상수는 field + getter 메소드 가 조합된 것으로 코드상에서 접근할 때 field 로 ..

Backend/Kotlin 2021.11.22

[Kotlin] companion object

companion object 는 호출시 자바의 static 처럼 보일 뿐 static 은 아니다. 만약 코틀린에서 해당 자원을 호출한다면 자바의 static 자원을 사용하던 것 처럼 사용하면 되는데 만약 자바에서 호출해야 한다면 companion object 내부 자원에 @JvmStatic 를 추가로 명시해줘야 한다. 예를 들어 Enum 의 @JsonCreator 를 활용할 때가 그렇다. companion object 를 활용해서 enum class 안에 팩토리 메소드를 만들고 @JsonCreator 를 걸어주는데 @JsonCreator 는 명시적으로 static 자원이어야 하기 때문에 @JvmStatic 도 필수로 걸어줘야 한다. https://www.bsidesoft.com/8187 https://..

Backend/Kotlin 2021.11.22

@JsonCreator

Spring 에서 직렬화/역직렬화 시 기본적으로 사용되는 ObjectMapper 에서는 역직렬화시 Getter 가 필요하고 직렬화시 기본생성자가 필요하다. 그런데 직렬화시 기본생성자 외에 인자가 있는 생성자나 팩토리 메소드를 활용할 수도 있다. @JsonCreator 어노테이션의 mode 속성은 한 개의 파라미터냐(DELEGATING), 여러 개의 파라미터냐(PROPERTIES)에 따라 선택하거나 자동으로 설정되도록 기본값(DEFAULT)으로 둘 수 있다. 일반적으로 기본값으로 두고 사용해도 무리는 없다. 인자가 있는 생성자를 활용하는 방법 주의할 점은 파라미터에 @JsonProperty 를 반드시 지정해야 한다. class Test { private String a; private String b; p..

Backend/Java 2021.11.19
728x90