본문 바로가기

전체 글249

[Spring Data JPA] JPA Enum 필드에 관한 문제 참나. 오늘 5시간 날렸다. Pagination 쿼리를 날리는 API에서 계속 500 에러가 나서 계속 붙잡고 있었다. 빨래 땜에 집에 왔지만 불굴의 의지로 해결해보리라 다짐하고 1시간만에 문제를 발견했다 증말. 문제점 결론부터 말하면 서버 DB에 잘못된 데이터가 들어가서였다. 문제는 JPA Enum 필드가 @Enumerated(EnumType.STRING) ㅣ이 아니라, Ordinal로 들어가 발생한 문제다. 지정한 Enum 상수는 총 4개 이며, ordinal의 범위는 0~3 이다. 4 이상의 숫자는 있어서는 안될 데이터다. 그래서 계속 이런 에러가 발생했다. java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4 쿼리.. 2023. 2. 21.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 2장 개략적인 규모 추정 시스템 설계 면접에서 가장 요구를 많이 받는 것은 시스템 용량이나 성능 요구사항을 개략적으로 추정하라는 요구가 많다. 보편적으로 통용 되는 성능 수치상에서 사고 실험을 행해 추정치를 계산하는 개략적인 규모 추정은 규모 확장성을 표현하는 기본기에 능숙해야 효과적으로 추정을 해낼 수 있다. 2의 제곱수 가장 많이 쓰이는 단위 근사치로 1천, 1백만, 10억 이름으로 킬로 바이트, 메가 바이트, 기가 바이트 축약형 표시로 1KB, 1MB, 1GB로 표시 가능 모든 프로그래머가 알아야 하는 응답 지연 값 구글의 제프 딘은 2010년 통상적인 컴퓨터에서 구현된 연산들의 응답지연 값을 공개했다. 이 수치들은 컴퓨터 연산들의 처리 속도의 지표가 되었다. 제시된 수치를 분석할 수 있는 능력을 기르자 가용성에 관한 수치.. 2023. 2. 19.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 1장 사용자 수의 따른 규모 확장성 작년 10월 원티드에서 진행한 백엔드 온보딩 챌린지에서 멘토님이 속하신 스터디에서 이 책을 다루셨던 것이 기억난다. 실제로 멘토링 후 백엔드 개발자가 읽어야 할 책들을 여러 개 추천해 주셨는데, 그 중 하나가 이 책이다. 그 책들을 꾸준히 완독해 나가는 중이고, 확실히 백엔드 개발 공부는 책을 통해서 간접 경험을 쌓거나 직접 적용하기에 용이하다고 생각이 들었다. 회사에 이 도서를 요청했고, 오늘 첫 페이지를 펼쳤다. 단일 서버 가장 기초적인 서버 구성 단위 데이터 베이스 서버도 보통 1개를 둔다. RDBMS 많이 사용 비정형 데이터이거나, 직렬화 역직렬화 하거나, 많은 양의 데이터를 저장할 경우 비-관계형 데이터베이스가 바람직함. 모든 트래픽을 하나의 서버가 감당한다. 수직적 규모 확장 & 수평적 규모 .. 2023. 2. 14.
가치 창출 스타트업의 대표가 가장 중요하게 생각하는 요소이다. 비단 스타트업이 아닌 여느 기업이든 가장 중요하게 여기는 요소이다. 어느덧 회사를 다닌 지 1개월을 훌쩍 넘어섰는데, 회의 때마다 이 가치 창출에 대한 얘기가 끝맺음이 된다. 첫 달은 회사 코드에 익숙해지느라 회의 내용의 대부분이 이해가 어려웠는데, 이제 슬슬 우리가 무엇을 서비스하는지를 알아가는 중이다. 조만간 아이디에이션에 적극 참여할 수 있겠다. 나는 너에게 무엇을 줄 수 있을까? 내가 좋아하는 돈을 많이 버려면 내가 만든 서비스를 이용하는 사람들에게 가치를 제공해야 한다. 추후에 확장할 아이디어가 있지만, 예비 고객들이 진정으로 원하는 요소인지 생각해 보면 나조차도 확신이 안 설 때가 많다. 화장실을 갈 때, 집에서 회사로 걸어갈 때, 운동하러 .. 2023. 2. 11.
[Reactive Programming] 비동기-논블로킹 프로그래밍 동기 프로그래밍 (Synchronous) 작업의 실행 흐름은 순차적으로 동작 코드를 파악하기 쉽고 결과를 쉽게 예측 가능하므로 디버깅이 쉬움 특정 작업 중 다른 작업을 할 수 없다는 단점 비동기 프로그래밍 (Asynchronous) 작업의 실행 흐름은 기본적으로 순차적이지 않음 현재 실행 중인 작업 이외에 다른 작업 가능. 클라이언트, 서버 등 모든 환경에서 유용하게 사용 가능 대표적으로 CallBack, Promise, Future, Coroutine 등이 있다. 비동기 프로그래밍 구현 방식 - Kotlin Thread 가장 기본이 되는 방식 Runnable 인터페이스를 구현하여 구현 하나의 스레드 - 싱글 스레드, 다중 스레드 - 멀티스레드 fun main() { for (i in 0..5) { va.. 2023. 2. 11.
사이드 프로젝트를 시작하게 되었다. 사이드 프로젝트를 시작하게 되었다. 회사 프론트 개발자 분이 사이드 플젝을 구할 수 있는 웹 서비스를 알려주셨고, 한번 해보고 싶다는 생각이 강하게 들었다. 슬러시와 오픈 채팅방을 포함하여 총 3곳에 신청 및 문의를 넣었고, 답변이 다들 없으시길래 요구하는 조건이 높겠구나 하는 생각이 들었다. 이왕 이렇게 된 거 내가 만들면 되지. 그 동안 추상적으로 구상한 서비스의 아이템을 한번 구현해보자. 구현하면서 실현 가능성을 확인해보자. 그렇게 같은 개발 길을 걷고 있는 형들에게 제안을 드렸고, 실행하게 되었다. 제대로 해보자 해서 노션도 정리하고, 깃헙 Organization도 만들었다. 이번 1달 동안 요구 사항을 구체적으로 정리한다는 목표도 세웠다. 개발을 시작하기 위해 필요한 선행 지식이 다른 프로젝트원.. 2023. 2. 7.
[Effective Kotlin] 아이템 49. 하나 이상의 처리 단계를 가진 경우에는 시퀀스를 사용하라 코틀린도 마찬가지로 Collection 처리를 위한 다양한 함수를 지원한다. 대표적으로 iterable 에서도 filter, map 등 동일한 함수를 지원하면서, 편리하게 사용할 수 있다. 하지만 지연 연산을 위해서는 자바와 같은 Stream, 코틀린에서는 Sequence를 사용하는 것이 좋다고 한다. 정리해보자. Iterable과 Sequence public inline fun Iterable.filter( predicate: (T) -> Boolean ): List { return filterTo(ArrayList(), predicate) } public fun Sequence.filter( predicate: (T) -> Boolean ): Sequence { return FilteringSeque.. 2023. 2. 4.
[Effective Kotlin] 아이템 47. 인라인 클래스의 사용을 고려하라 이펙티브 코틀린을 거의 다 읽어 간다. 이펙티브 자바나 코틀린이나 백엔드에서 API를 설계하는 것 뿐만 아니라 특정 분야의 사용에 국한되지 않고, 언어 자체를 어떤식으로 작성해야 하는지를 알려주는 책이다. 나는 코틀린으로 라이브러리를 만들고 있지 않기 때문에, 백엔드 개발에 필요한 부분을 따로 되새기고자 특정 유용한 아이템들만 블로그에 정리한다. 따로 글로 정리하지 않은 나머지 챕터는 읽어가며 코틀린에 대해 더 깊은 이해를 하려 노력한다. Inline 한정자가 참 많이 나왔는데, 거의 고차 함수나 탑 레벨 함수에 많이 사용하는 것으로 학습했다. 성능적 부분에서 객체를 따로 생성하지 않고 함수 내부로 편입되기에 우수하므로, 인상 깊은 개념이었다. 톱레벨 함수나 고차 함수를 유틸리티 함수를 제외하면 Inli.. 2023. 2. 3.
[Spring Data JPA] 한방 쿼리의 효능 (feat : JPQL) 백엔드 개발의 기본 소양인 SQL을 작성하는 실력은 뛰어날 수록 더할 나위 없다. 실제로 대규모 트래픽이 발생하는 서비스에서는 이 성능을 매우 중요시 하는데, 일반적인 환경에서는 DB 조회적 측면에서 큰 성능 개선을 이끌 수 있으므로, 가장 기본이 되는 개선 방안이라고들 한다. SQL을 공부하고, JPA 를 공부하며 항상 빠질 수 없는 얘기, 성능 최적화. 항상 고민하다가 개선을 할 수 있는 기회가 주어졌고, 공부한 내용을 바탕으로 내 생각과 결과를 정리해보겠다. DB ERD Model opnions entity를 paging 처리해서 여러 개를 뽑아야 하는 상황. 주어진 중요 파라미터는 user_id 뿐이다. 1. 보통 같으면 Document Entity를 먼저 조회한 후, opinions 를 페이징 .. 2023. 2. 1.
[Effective Kotlin] 아이템 36. 상속보다는 컴포지션을 사용하라 [이펙티브 자바] 를 읽었던 기억을 떠올렸을 때 '상속보다는 컴포지션을 사용하라' 라는 아이템이 상당히 인상 깊었다. 하지만 컴포지션 적용시키면서 다형성을 만족시키려면 인터페이스를 상속 받아야 하는데, 모두 구현해야 하므로 코드가 참 더러워지는 것을 확인할 수 있었다. 코틀린을 이를 기가 막히게 해결했다. 다시 상속과 컴포지션의 예를 살펴보고 이를 코틀린이 어떻게 간단히 해결할 수 있는지 살펴 보자. 상속의 문제점 모든 것을 가져올 수밖에 없음 슈퍼클래스의 상태, 메서드, 행위 등 모든 것을 가져온다. 계층 구조를 나타낼 때 굉장히 좋은 도구 그렇기에 일부분만을 사용하기에 부적합한 방법 이를 위해서 컴포지션을 사용한다. 캡슐화를 깨는 상속 내부적인 구현 방법의 변경으로 캡슐화가 깨진다. 컴포지션 슈퍼클래.. 2023. 1. 30.
[Spring Data JPA] Transaction 없이 읽기 회사에 입사해서 코드를 살펴보던 중에 분명히 jpa entity 객체의 읽기 과정 중, 분명히 트랜잭션 처리가 필요한 코드가 보였다. 이를테면 Spring Security 인증을 거치고 Security Context Holder 에 저장된 UserPrinciple 객체 @Target(AnnotationTarget.VALUE_PARAMETER) @Retention(AnnotationRetention.RUNTIME) @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : user") annotation class CurrentUser(val require: Boolean = true) 이러한 애노테이션을 흔히들 전역적으로 Api 에서.. 2023. 1. 30.
[Effective Kotlin] 아이템 32. 생성자 대신 팩토리 함수를 사용하라 자바를 공부하며 가장 의미 있게 읽은 책은 [이펙티브 자바]이다. 자바를 만든 개발자가 직접 집필한 책이므로, 자바를 자바답게 사용하는 방법이 아주 명확하게 설명되어 있다. 가장 첫 챕터인 '생성자 대신 팩토리 메소드를 사용하라'라는 아이템을 굉장히 의미 있게 읽게 되었고, 그 내용을 코드를 작성할 때 애용했었다. 코틀린도 자바의 이점을 그대로 가져간 언어이므로, 비슷하게 적용 되는 부분이 있을지를 생각해 봤다. 회사에 들어가서 코틀린을 배우고 코드를 작성하면서, 가장 눈에 띄었던 부분이 dto 객체를 매핑하는 부분이었고, 팩토리 메서드를 사용하면 어떨까라는 생각을 했다. 코틀린을 사용하는 분들과 구글링을 통해 자바와 동일하게 팩토리 메서드를 많이들 사용한다는 정보를 얻었고, 그대로 적용했었다. 이펙티브.. 2023. 1. 29.
[Effective kotlin] 아이템 27. 변화로부터 코드를 보호하려면 추상화를 사용하라 자바를 공부하며 객체지향을 제대로 공부하기 시작했고, 객체지향의 4대 특성 중 '추상화'의 참된 의미를 알기까지 시간이 걸렸다. 결론은 많이 공부하고 생각하며 확장하고 적용해 봐야 그 의미를 비로소 이해하리라 생각한다. 상수 const val NAME_PREFIX = "prefix" fun getName() : String = NAME_PREFIX + this.name 가장 간단한 추상화 방법이다. 본 코드에서 String 리터럴 값을 따로 빼서 상수화를 시키면 이해도 쉬울 뿐 아니라. 변경하기도 훨씬 수월하다. 리터럴 값에 의미 있는 이름을 붙일 수 있고, 변경이 쉽다. 함수 특정 행위를 함수로 선언하면, 재사용이 가능하다. 코틀린에서는 간단히 확장 함수를 만들어서 여러 곳에서 재사용할 수 있어, 추상.. 2023. 1. 29.
[Effective Kotlin] 아이템 24. 제네릭 타입과 variance 한정자를 활용하라 자바를 공부하고 적용하면서 추상화를 하기 위해 인터페이스를 적극 활용했었고, 강타입 언어였기에 특히 타입을 잘 활용했어야 했다. 그 과정에서 제네릭을 다시 한번 공부하게 되었고, 공변, 반공변 성 등의 특징을 제네릭이 어떻게 풀어냈는지 공부했다. extend, super 등의 한정자를 사용하여 타입을 적절히 제어했었던 기억이 있다. 코틀린도 마찬가지로 제네릭의 한정자를 제공한다. 자바의 결함을 개선하면서 말이지. Out 한정자 파라미터를 공변으로 만든다. class University open class Student class FreshMan : Student() fun main(args: Array) { val b: University = University() // OK val a: Universi.. 2023. 1. 27.
[Effective Kotlin] 아이템 23. 타입 파라미터의 섀도잉을 피하라 섀도잉이란 무엇인가? class Person(val name : String) { fun addPerson(name : String) { // ... } } addPerson() 함수의 파라미터가 Person class의 프로터티 이름과 같아진다. 외부 스코프의 프로퍼티를 가리게 되는 경우를 섀도잉이라 한다. 이를 개발자가 알아차리기 힘든 경우가 생긴다. 타입 파라미터에서도 문제가 생긴다. interface Payment class KakaoPay: Payment class NaverPay: Payment class PaymentHistory { fun addPayment(payment: T) { // ... } } 이러한 경우는 PaymentHistory의 제네릭 타입과 addPayment()의 타입 .. 2023. 1. 25.
반응형