JPA 자체만으로는서 동일한 키 값을 가지는 두 엔티티를 조회했을때 동일성을 보장해주지 않는다. 따라서 로직상 동일한 키를 가지는 두 엔티티를 비교하기 위해선 반드시 equals와 hashCode를 재정의해야한다. # 단일키일 경우 다음과 같은 PK로 하나의 값을 가지는 엔티티를 가정해보자. @Entity data class OneKeyEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L ) 이제 이 코드를 실행해서 리포지토리에서 가져온 동일한 두 ID 엔티티가 동일한지 확인해보면, val oneKeyFirst = oneKeyEntityRepository.findById(1).orElseThrow() val on..
지난글에 이어 이번에는 Exposed로 DAO 스타일 엔티티와 DSL 스타일 쿼리를 작성해본다. 그리고 공통 엔티티에 사용되는 BaseEntity를 작성하는 방법을 공유한다. 소스코드 https://github.com/mopil/ktor-server GitHub - mopil/ktor-server: HikariCP + MySQL + Exposed (DAO) + Koin HikariCP + MySQL + Exposed (DAO) + Koin. Contribute to mopil/ktor-server development by creating an account on GitHub. github.com Exposed 위키 https://github.com/JetBrains/Exposed/wiki Home Ko..
서버에서 발생하는 로그를 슬랙으로 자동으로 전송하는 설정을 알아보자 # 웹훅 생성 https://mopil.tistory.com/159 [Spring Boot] Slack 메시지 보내기 어플리케이션에서 슬랙으로 메시지를 보내는 방법에 대해 공유한다. 토큰을 사용한 봇 방법과 웹훅 방법이 있는데, 여기서는 웹훅 방법을 통해 구현한다. # 웹훅 만들기 먼저 원하는 워크스페이 mopil.tistory.com 웹훅을 먼저 생성한다. 위 글을 참조할 것 # application.properties 및 기타 설정 위 구조로 설정파일들을 생성한다. application-dev.properties에서 logback 설정파일을 읽을 수 있도록 다음을 추가한다. (live도 동일) logging.config=classpa..
어플리케이션에서 슬랙으로 메시지를 보내는 방법에 대해 공유한다. 토큰을 사용한 봇 방법과 웹훅 방법이 있는데, 여기서는 웹훅 방법을 통해 구현한다. # 웹훅 만들기 먼저 원하는 워크스페이스로 들어간 다음 웹훅을 생성한다. add webhook을 누르면 이렇게 채널을 선택할 수 있다. 여기서 대표 채널 하나만 설정하고, 나중에 어플리케이션 레벨에서 하나의 웹 훅으로 여러 채널에서 공유해서 쓸거다. # SlackClient @Component class SlackClient( private val restTemplate: RestTemplate, @Value("\${slack.webhook.url}") private val webhookUrl: String, ) { data class SlackMessage..
지난 글에 이어, 이번에는 데이터베이스를 연동해 볼 것이다. Ktor는 스프링과 다르게 데이터베이스 커넥션풀을 기본적으로 제공하지 않으므로, HikariCP를 수동으로 설정해야 한다. 또한 JPA를 사용할 수 없으므로 같은 회사에서 제작한 코틀린 전용 ORM인 Exposed를 사용한다. 소스코드 https://github.com/mopil/ktor-server GitHub - mopil/ktor-server: HikariCP + MySQL + Exposed (DAO) + Koin HikariCP + MySQL + Exposed (DAO) + Koin. Contribute to mopil/ktor-server development by creating an account on GitHub. github.c..
Ktor에는 스프링과 다르게 기본적으로 의존성 주입을 지원해주지 않는다. (경량 프레임워크라 그런가... 스프링이 무겁고 러닝커브가 높지만 참 많은 것을 지원해 주는 것 같다.) 여하튼 그래서 이번에는 Koin이라는 코틀린 의존성 주입 라이브러리를 통해서 의존성 주입을 설정해 보자. 소스코드 https://github.com/mopil/ktor-server GitHub - mopil/ktor-server: HikariCP + MySQL + Exposed (DAO) + Koin HikariCP + MySQL + Exposed (DAO) + Koin. Contribute to mopil/ktor-server development by creating an account on GitHub. github.com..
Ktor에는 스프링과 다르게 GET요청으로 넘어오는 쿼리 파라미터를 바로 객체로 직렬화해서 받는 기능을 제공하지 않는다. fun Route.productRouter() { val productService: ProductService by inject() get(Uris.Product.GET_ALL_PRODUCTS) { val params = call.parameters["name"] call.respond(productService.getAllProducts(params)) } } 이런식으로 call.parameters에서 하나하나 꺼내서 작업해야한다. 검색쿼리 처럼 쿼리 파라미터가 많이 넘어오는 경우는 객체로 바로 직렬화해주면 편할 것 같아서 유틸 함수를 만들어봤다. object RequestUtil..
인텔리제이에서 깃허브 계정을 여러개 설정해놓고 커밋을하면 원하지 않는 계정으로 커밋되는 경우가 생긴다 (특히 회사계정으로 개인계정에 커밋하는 경우가 빈번한데... 이러면 커밋 기록이 남지 않아 아쉽다...) 그래서 매번 커밋을 할 때마다 현재 깃 계정을 확인하고 바꾼뒤 커밋을 해야하는데, 매번 이러면 귀찮으니까 쉘 스크립트로 그나마? 자동화를 해봤다. (물론 그래도 매번 실행시켜야해서 귀찮긴 하지만...) #!/bin/bash CURRENT_USERNAME=$(git config --global user.name) CURRENT_EMAIL=$(git config --global user.email) USER_A_NAME="mopil" USER_A_EMAIL="mopil1102@gmail.com" USER..