목록전체 글 (198)
밤빵's 개발일지
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bcHpy8/btsK0kzlLzq/C73evjf5hc0XlpPL4h0ZSk/img.webp)
코틀린을 공부하면서 람다와 함수 사용에서의 성능 문제에 대해 접하게 되었다. 특히, 람다를 무명 클래스로 컴파일하는 코틀린의 특성 때문에 성능 저하의 가능성이 있다는 점을 알게 되면서 람다의 효율성을 개선하기 위해 사용하는 inline 함수와 타입 보존을 위한 reified 키워드에 대해 학습하고, 각각의 개념과 동작 원리를 정리해야 할 필요를 느꼈다.....! Inline 함수코틀린에서 람다는 기본적으로 무명 클래스로 변환된다. 무명 클래스란 특정 시점에 객체로 만들어지는 임시 클래스를 의미하고, 이 과정에서 메모리를 추가로 사용하게 된다. 그렇다고 모든 람다가 매번 새로운 클래스를 생성하는 것은 아니고, 람다가 특정 변수를 포획할 때(클로저 사용 시) 새로운 무명 클래스 객체가 생성된다. 이런 과정..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/c4e9YC/btsKZI0xQAi/kr3u1LwCH5soMhI7k407w1/img.webp)
자바의 스트림과 코틀린의 시퀀스 두 가지 모두 컬렉션 데이터를 처리하는 데 있어 유용한 기능을 제공하지만, 몇 가지 차이점이 있다. ▶ 자바 스트림과 코틀린 시퀀스자바 스트림(Java Stream)자바 8부터 도입된 스트림은 컬렉션의 요소들을 필터링, 매핑, 집계하는 기능을 제공한다. 스트림은 lazy하게 처리되고, 최종 연산이 호출되기 전까지 실제 연산을 수행하지 않는다. 효율적인 메모리 사용과 최적화를 가능하게 한다.코틀린 시퀀스(Kotlin Sequence)코틀린 시퀀스도 자바 스트림과 비슷하게 컬렉션 데이터를 lazy하게 처리하고, 코틀린에서는 더 많은 확장 함수를 제공하여 시퀀스를 다루기 쉽게 만들어 준다. 코틀린 멀티 플랫폼에서도 사용할 수 있다는 점이 큰 장점이다.▶ 자바 스트림과 코틀린 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/beNb4B/btsKXJZ1bnD/Vih0aLOXO0MZN2N09RxMxK/img.webp)
코틀린으로 자동차 경주 게임을 구현한 프리코스 2주차 과제 내용을 바탕으로 개발일지를 작성했다. 프리코스 1주차 과제 하면서 나 코틀린으로는 코테 절대못푼다😢 라는 생각이 들어서 과제만 해보자란 생각으로 꾸역꾸역 과제를 했었다. 코틀린을 배우고싶어서 시작한 거였는데 ai없이 코드를 작성하려고하니까 잘 모르기도하고, 작성법은 낯설어 죽겠고 시간이 너무 많이 소요되서 포기부터 하고 간략하게만 구현했다. 경험해본걸로 만족하고 공부 더 열심히 하는걸로..! ▶과제 요구사항 분석2주차 과제는 사용자가 입력한 자동차 이름과 시도할 횟수에 따라 자동차 경주 게임을 진행하는 프로그램을 작성하는 것으로 주요 기능으로는 자동차 이름과 횟수를 입력받고, 경주 로직을 통해 자동차의 이동을 결정하며, 최종적으로 우승자를 결..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/biUIEf/btsKUD7z0x1/uq1V108O1kvA2gmKnaicI1/img.webp)
디미터의 법칙이란 객체 지향 설계에서 결합도를 낮추고, 유지보수성을 높이는 중요한 원칙이다. 객체 간의 관계를 제한함으로써 복잡성을 줄이고, 응집도를 높이는 것을 목표로 하는 이 법칙을 이해하고, 이를 실제 코드에 어떻게 적용할 수 있을지 고민하면서 학습한 내용을 정리하기로 했다. ▶디미터의 법칙디미터의 법칙은 객체 지향 설계에서 캡슐화와 정보 은닉을 잘 지키도록 돕는 원칙이다. "친구하고만 대화하라"( 객체는 자신이 직접 참조하고 있는 객체와만 상호작용하고, 다른 객체의 내부 구조를 알지 않도록 설계해야한다는 의미)는 규칙을 통해 객체 간의 의존성을 줄이고, 각 객체가 자신의 역할에 충실하도록 설계할 수 있다. 결합도를 낮추고, 코드의 유연성을 높이는 것을 목표로 한다. 객체 간의 의존성을 줄임으로써..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bN0HH9/btsKTxl01vP/kdgBqRbcDIfDG6AJZyJjCk/img.webp)
프로젝트 작업 중 발생한 @Value 애노테이션 충돌 문제를 해결하기 위해 @PostConstruct를 사용했다. 실무에서도 종종 발생한다고 하는 Spring 어노테이션간의 충돌과 설정초기화의 순서 문제로, 이 과정을 통해 Spring 애노테이션 간의 충돌 문제와 초기화 순서에 따른 문제를 어떻게 해결했는지에 대해 기록하기로했다.▶문제 상황처음 프로젝트에서는 JwtUtil 클래스에서 @Value 애노테이션을 사용해 JWT 서명 키를 설정하려고 했다. 하지만, 같은 프로젝트 내의 다른 클래스에서도 @Value 애노테이션을 사용하여 PUBG API 키를 설정하고 있었기 때문에 충돌이 발생했다. 충돌의 원인은 Spring 컨텍스트에서 빈이 생성되는 시점에 값이 주입되는 Spring 라이프사이클의 문제였다. ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/FAwKT/btsKTl0bDT1/JBz6rNEn0xL2LzNU9PFD4k/img.webp)
개발 중 공통적인 기능들을 제공하기 위해 유틸리티 클래스를 사용하는 것은 흔한 일이다. 하지만, "유틸리티 클래스는 악이다"라는 주장을 보게되고, 유틸리티 클래스가 가진 단점과 객체지향적인 접근 방식의 차이를 구체적으로 이해할 필요성을 느꼈다.▶ 유틸리티 클래스유틸리티 클래스는 여러 클래스에서 공통적으로 사용할 수 있는 메서드들을 정적(static)으로 구현한 클래스를 의미한다. 자바의 Math 클래스나 Collections 클래스가 대표적인 예이다. 유틸리티 클래스는 인스턴스를 생성하지 않고도 메서드를 호출할 수 있고, 상태를 가지지 않는다.▷유틸리티 클래스public class MathUtil { public static int add(int a, int b) { return a +..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/32N4m/btsKTYbKzI0/svCZa2A2Tzsk0yzUBt68T0/img.webp)
▶ 문제 상황 PUBG 프로젝트에서 매치 데이터를 가져와서 roster 데이터를 정리하는 과정에서 문제를 겪었다. 초기 로스터 응답은 원하는 형태와 다르게 나왔다. 응답 데이터에서 로스터의 attributes에는 참가자의 세부 정보가 중복되어 포함되어 있어서 로스터의 데이터 구조가 복잡하고 불필요한 정보가 많고, pubg데이터와 너무나도 다른 구조의 데이터가 나왔다. 초기 응답 형식은 이랬다. { "type": "roster", "id": "e73c7460-eba1-489c-a834-8d393c0499b5", "attributes": { "stats": { "rank": 11, // 있어야하는 데이터 "teamId": 9, // 있어야하는 데이터 "assists..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/GFIT3/btsKS7FFYj3/plXqCYnfs7DdSUKsRa9yK0/img.webp)
생각없이 보던 화면에 코드가 보여서 살펴보다가, 멀티스레드 환경에서 동기화 문제를 해결하기 위한 synchronized 키워드를 사용해 본 적은 없었기 때문에, 이 기회에 학습 겸 개발일지를 작성하기로 했다. 코드 예시를 통해 synchronized 키워드가 실제로 어떻게 사용되는지, 어떤 문제를 해결할 수 있는지, 그리고 이 키워드를 사용할 때 주의해야 할 점 까지 정리를 해보기로했다. ▶ synchronized 키워드멀티스레드 환경에서 여러 스레드가 하나의 공유 리소스에 동시에 접근하려 할 때, Race Condition과 같은 문제가 발생할 수 있다. synchronized 키워드는 이러한 문제를 방지하기 위해 사용되고, 공유 리소스에 대한 접근을 하나의 스레드로 제한한다.특징synchronized..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/drGk6U/btsKQHue6A8/GfgsbkOji3kwGvhP8htAPk/img.webp)
.@JsonInclude는 JSON 직렬화 과정에서 필드의 포함 여부를 결정하는 역할을 한다. 프로젝트에서 처음 이 어노테이션을 접하게 된 계기로 @JsonInclude의 개념, 옵션, 적용 방법, 장단점 등을 학습하며 개발일지에 정리하기로 했다. ▶@JsonInclude란?@JsonInclude는 Jackson 라이브러리에서 제공하는 어노테이션으로, JSON 직렬화 과정에서 특정 필드를 직렬화할지 말지를 결정하는 역할을 한다. 예를 들어, 객체의 특정 필드가 null이거나 기본값일 때 그 필드를 JSON에 포함할지 여부를 설정할 수 있다. 이 기능은 직렬화된 JSON 데이터를 보다 간결하고 효율적으로 만들 수 있으며, API 통신 시 불필요한 데이터를 줄이는 데 큰 도움이 된다.기본적으로 @JsonI..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bDTNop/btsKOLjzXwt/7ue6jsR2QM8iXKLZvbR911/img.webp)
FACADE 패턴은 시스템의 복잡한 부분을 감추고, 단순화된 인터페이스를 제공함으로써 사용자가 쉽게 사용할 수 있도록 돕는 디자인 패턴이다. 이번 개발일지를 통해 FACADE 패턴의 개념을 학습하고 이를 실제 코드에 어떻게 적용할 수 있는지 이해해보려고 한다. ▶FACADE 패턴?FACADE 패턴은 복잡한 서브 시스템이나 여러 클래스들로 구성된 코드를 단순화하기 위해 사용하는 디자인 패턴이다. 이 패턴은 여러 개의 클래스들이 서로 복잡하게 상호작용하는 시스템을 단순하게 사용할 수 있는 단일 인터페이스를 제공한다. 복잡한 내부 구조를 숨기고 외부에서는 단순한 메서드 호출만으로도 다양한 기능을 사용할 수 있게 만들어 준다.이 패턴의 목적은 코드의 복잡성을 줄이고 유지보수성을 높이는 것이다. 개발자가 직접 여..