📖 개발 공부
-
JPA N+1 문제 해결 일지 - 답은 JPQL에 있었다.📖 개발 공부 2024. 3. 3. 11:22
프로젝트 개발하면서 JPA에서 N+1 문제를 발견하여 원인과 해결한 방법들을 공유하고자 한다! 다음과 같은 Candidate 엔티티가 존재한다. @Entity @Table(name = "candidate") class CandidateEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null, @Enumerated(EnumType.STRING) var sourceType: SourceType, // 출처 소스 타입 var sourceId: String, // 출처 소스의 id var createdAt: LocalDateTime, // 생성일 @OneToOne(cascade = [CascadeType.ALL]) @..
-
Line | 오픈채팅 시스템 설계📖 개발 공부 2024. 2. 18. 02:24
“LINE 오픈챗 서버가 100배 급증하는 트래픽을 다루는 방법”을 보면서 오픈 채팅 시스템 설계를 정리한 내용이다! 오픈 채팅 시스템의 아키텍처는 다음과 같다. 채팅의 다양한 이벤트(메시지 전송, 메시지 반응, 메시지 읽음 등)들을 채팅 서버에 보낸다.해당 이벤트들을 모두 스토리지에 저장한다.그리고 Kafka에 해당 이벤트들을 발행한다.푸시 서버는 해당 이벤트들을 소비하여, 사용자들에게 해당 이벤트가 발생했다고 알린다.사용자는 해당 이벤트를 조회한다. 이때 스토리지에 접근하여, 새 메시지를 화면에 추가하는 액션을 실행한다. 이 아키텍처에서 트래픽이 급증할 수 있는 패턴들을 살펴보자.Hot Pattern 1: 수십개의 메시지를 주고받는 핫 챗만약 한 채팅에 5천명 이상의 사용자가 있다고 해보자.이때 [..
-
Toss | null return은 코드 복잡성을 만든다.📖 개발 공부 2024. 2. 17. 01:02
토스 테크블로그를 읽고 쓰는 글입니다.https://toss.tech/article/engineering-note-2 개발자 고객을 위한 코드 복잡성 관리! ☑️ 체크리스트ㄴ 코드 한줄을 바꾸기 위해 바꿔야할 코드가 많다?ㄴ 메서드 인자에 값을 추가하기 위해 지나가는 모든 메서드 인자 값을 추가한 적이 있다?ㄴ ... 하나라도 체크를 했다면, 코드 복잡성을 경험해본 것이다! 직접 겪어보고 크게 공감되었던 두개의 체크리스트만 가져와보았다. 코드를 바꿔야할 때 위의 경험들에 대해 고민을 해왔던 적이 종종 있었다. 과연 이게 올바른 방향일까? 라는 의문과 함께. “코드를 읽는 사람 입장에서 null은 복잡성을 만든다.” 예시를 보자.val user: User? = userRepository.findByNam..
-
Kotest 예제와 함께 테스트 코드 살펴보기📖 개발 공부/kotlin 2024. 2. 4. 16:09
테스트 코드를 작성하는 이유 나는 크게 세가지 이유로 테스트 코드를 작성한다. 내가 개발한 기능들이 제대로 잘 동작하는지 확인하기 위함. 코드에 변경이 생겼을 때, 기존 기능에 영향을 주는지 여부를 확인하기 위함. 이를 통해 예상하지 못한 버그 발생을 사전에 찾아내고, 배포 시의 불안함을 줄일 수 있다. 테스트 코드를 통해 실제 코드의 작동 방식을 더 빠르게 이해시키기 위함. 정적인 문서는 쉽게 방치될 수 있다. (유경험자..) 따라서 테스트 코드는 변경된 기능들을 최신화할 수 밖에 없는! 유일(?)한 방법이라고 생각한다. 또한 문서라고 하믄, 가독성이 충분히 있어야 한다. 가독성 있는 테스트 코드는 정말 도움되는 문서라고 할 수 있다. 테스트 코드 용어 살펴보기 sut System Under Test ..
-
빌드 관리 도구, 예제와 함께 Gradle 알아보기📖 개발 공부 2024. 1. 21. 11:00
프로젝트에서 gradle이 어떻게 돌아가는지 이해도를 높이기 위해 글을 작성해보겠다. 일단, 공식 문서 내용이 너무 많아서 🥲 프로젝트에 적용했던 설정들을 토대로 정리해보려고 한다. Gradle 이란? gradle은 오픈소스 빌드 자동화 툴이다. 어떤 플랫폼에서든 소프트웨어를 구축, 테스트, 게시 및 배포하는 경우 gradle은 코드 컴파일 및 패키징부터 웹 사이트 게시까지 전체 개발 수명주기를 지원할 수 있는 유연한 모델을 제공한다. 컴파일(Compile): Gradle은 Java 파일을 바이트코드로 컴파일하는 과정을 자동화한다. 테스트(Test): 어플리케이션이 예상대로 정상 작동하는지 확인하는 자동화된 테스트를 수행한다. 패키징(Packaging): JAR 또는 WAR 파일과 같은 배포 가능한 형태..
-
링크드리스트 구조로 정제 규칙 순서 관리하기📖 개발 공부 2023. 12. 20. 00:06
현재 속해있는 팀에서 장소 이름을 정제하는 태스크를 진행하고 있다. 공공데이터로부터 장소 이름을 가져와서 우리가 만들어놓은 정제 규칙들을 통해 정제하여 데이터화하는 과정이라고 볼 수 있다. 이 정제 과정이 필요한 이유는 크게 두가지가 있다. 깔끔하고 통일성 있는 장소이름을 유저에게 보여주기 위함. 여러 공공데이터를 통해 데이터화를 하는데, 공공데이터 간 중복 장소가 있을 수 있음. 정제를 통해 이 중복 장소들을 하나의 장소로만 데이터화하기 위함. 이러한 이유로 정제 고도화는 우리 팀에서 중요한 태스크이다! 첫 정제 과정에서는, 이상한 패턴들을 가진 이름들을 수정하기 위한 규칙들을 코드 내에서 관리하고 있었다. 하지만 정제해야 할 케이스들이 끝도 없이 나왔다.. 😱 😱 이상한 이름들을 가진 데이터를 제보받..
-
도메인 모델에 kotlin의 data class가 적합할까?📖 개발 공부/kotlin 2023. 12. 10. 12:00
회사 프로젝트에서 비즈니스 로직이 담긴 도메인 모델을 만들 때 kotlin의 data class를 사용하고 있다. 언제 class를 사용하고, 또 언제 data class를 사용하는 게 적합한지 제대로 숙지하지 못하고 무분별하게 쓰고 있는 것 같아 이번 기회에 공부해보려고 한다! 코틀린의 공식 문서를 보자 👀 Data classes in Kotlin are classes whose main purpose is to hold data. 데이터 클래스(Data class)는 데이터 보관 목적으로 만든 클래스를 말한다. 데이터 보관을 목적으로 만들었다라.. 뭔가 DTO의 역할을 말해주고 있는 것 같다. (데이터 전달) 도메인 모델은 데이터 보관 역할을 넘어서 비즈니스 로직을 구현하고 도메인의 행위를 정의하는 ..
-
다양한 좌표계를 위경도 좌표로 변환해보기 수난시대 (feat. geotools)📖 개발 공부 2023. 11. 5. 16:17
회사에서 외부 공공데이터들을 가져와서 POI화하는 업무를 맡았다. 공공데이터들은 각기 다른 EPSG 좌표계를 사용하고 있다. 주소 데이터: GRS80 UTM-K 기준 → EPSG:5179 지방행정인허가 데이터(LocalData): 중부원점TM(Bessel) → EPSG:5174 DB에 저장할 최종 좌표계는 EPSG:4326이다. 이는 우리가 흔히 쓰는 위경도 좌표라고 보면 된다. 여기서 EPSG가 뭐신가 EPSG 코드는 전세계 좌표계 정의에 대한 고유한 명칭이다. EPSG 코드에 대한 상세 정의는 proj4와 wkt라는 문자열로 되어 있다. EPSG.io: Coordinate Systems Worldwide EPSG.io: Coordinate systems worldwide (EPSG/ESRI), pre..