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..
JetBrains에서 제작한 Ktor라는 프레임워크로 간단한 서버 어플리케이션 세팅을 하는 방법을 공유한다. 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 Generator라는 웹사이트를 통해서 프로젝트를 생성하자. https://start.ktor.io/?_ga=2...