목록티스토리챌린지 (21)
밤빵's 개발일지
코틀린으로 자동차 경주 게임을 구현한 프리코스 2주차 과제 내용을 바탕으로 개발일지를 작성했다. 프리코스 1주차 과제 하면서 나 코틀린으로는 코테 절대못푼다😢 라는 생각이 들어서 과제만 해보자란 생각으로 꾸역꾸역 과제를 했었다. 코틀린을 배우고싶어서 시작한 거였는데 ai없이 코드를 작성하려고하니까 잘 모르기도하고, 작성법은 낯설어 죽겠고 시간이 너무 많이 소요되서 포기부터 하고 간략하게만 구현했다. 경험해본걸로 만족하고 공부 더 열심히 하는걸로..! ▶과제 요구사항 분석2주차 과제는 사용자가 입력한 자동차 이름과 시도할 횟수에 따라 자동차 경주 게임을 진행하는 프로그램을 작성하는 것으로 주요 기능으로는 자동차 이름과 횟수를 입력받고, 경주 로직을 통해 자동차의 이동을 결정하며, 최종적으로 우승자를 결..
디미터의 법칙이란 객체 지향 설계에서 결합도를 낮추고, 유지보수성을 높이는 중요한 원칙이다. 객체 간의 관계를 제한함으로써 복잡성을 줄이고, 응집도를 높이는 것을 목표로 하는 이 법칙을 이해하고, 이를 실제 코드에 어떻게 적용할 수 있을지 고민하면서 학습한 내용을 정리하기로 했다. ▶디미터의 법칙디미터의 법칙은 객체 지향 설계에서 캡슐화와 정보 은닉을 잘 지키도록 돕는 원칙이다. "친구하고만 대화하라"( 객체는 자신이 직접 참조하고 있는 객체와만 상호작용하고, 다른 객체의 내부 구조를 알지 않도록 설계해야한다는 의미)는 규칙을 통해 객체 간의 의존성을 줄이고, 각 객체가 자신의 역할에 충실하도록 설계할 수 있다. 결합도를 낮추고, 코드의 유연성을 높이는 것을 목표로 한다. 객체 간의 의존성을 줄임으로써..
프로젝트 작업 중 발생한 @Value 애노테이션 충돌 문제를 해결하기 위해 @PostConstruct를 사용했다. 실무에서도 종종 발생한다고 하는 Spring 어노테이션간의 충돌과 설정초기화의 순서 문제로, 이 과정을 통해 Spring 애노테이션 간의 충돌 문제와 초기화 순서에 따른 문제를 어떻게 해결했는지에 대해 기록하기로했다.▶문제 상황처음 프로젝트에서는 JwtUtil 클래스에서 @Value 애노테이션을 사용해 JWT 서명 키를 설정하려고 했다. 하지만, 같은 프로젝트 내의 다른 클래스에서도 @Value 애노테이션을 사용하여 PUBG API 키를 설정하고 있었기 때문에 충돌이 발생했다. 충돌의 원인은 Spring 컨텍스트에서 빈이 생성되는 시점에 값이 주입되는 Spring 라이프사이클의 문제였다. ..
개발 중 공통적인 기능들을 제공하기 위해 유틸리티 클래스를 사용하는 것은 흔한 일이다. 하지만, "유틸리티 클래스는 악이다"라는 주장을 보게되고, 유틸리티 클래스가 가진 단점과 객체지향적인 접근 방식의 차이를 구체적으로 이해할 필요성을 느꼈다.▶ 유틸리티 클래스유틸리티 클래스는 여러 클래스에서 공통적으로 사용할 수 있는 메서드들을 정적(static)으로 구현한 클래스를 의미한다. 자바의 Math 클래스나 Collections 클래스가 대표적인 예이다. 유틸리티 클래스는 인스턴스를 생성하지 않고도 메서드를 호출할 수 있고, 상태를 가지지 않는다.▷유틸리티 클래스public class MathUtil { public static int add(int a, int b) { return a +..
▶ 문제 상황 PUBG 프로젝트에서 매치 데이터를 가져와서 roster 데이터를 정리하는 과정에서 문제를 겪었다. 초기 로스터 응답은 원하는 형태와 다르게 나왔다. 응답 데이터에서 로스터의 attributes에는 참가자의 세부 정보가 중복되어 포함되어 있어서 로스터의 데이터 구조가 복잡하고 불필요한 정보가 많고, pubg데이터와 너무나도 다른 구조의 데이터가 나왔다. 초기 응답 형식은 이랬다. { "type": "roster", "id": "e73c7460-eba1-489c-a834-8d393c0499b5", "attributes": { "stats": { "rank": 11, // 있어야하는 데이터 "teamId": 9, // 있어야하는 데이터 "assists..
생각없이 보던 화면에 코드가 보여서 살펴보다가, 멀티스레드 환경에서 동기화 문제를 해결하기 위한 synchronized 키워드를 사용해 본 적은 없었기 때문에, 이 기회에 학습 겸 개발일지를 작성하기로 했다. 코드 예시를 통해 synchronized 키워드가 실제로 어떻게 사용되는지, 어떤 문제를 해결할 수 있는지, 그리고 이 키워드를 사용할 때 주의해야 할 점 까지 정리를 해보기로했다. ▶ synchronized 키워드멀티스레드 환경에서 여러 스레드가 하나의 공유 리소스에 동시에 접근하려 할 때, Race Condition과 같은 문제가 발생할 수 있다. synchronized 키워드는 이러한 문제를 방지하기 위해 사용되고, 공유 리소스에 대한 접근을 하나의 스레드로 제한한다.특징synchronized..
.@JsonInclude는 JSON 직렬화 과정에서 필드의 포함 여부를 결정하는 역할을 한다. 프로젝트에서 처음 이 어노테이션을 접하게 된 계기로 @JsonInclude의 개념, 옵션, 적용 방법, 장단점 등을 학습하며 개발일지에 정리하기로 했다. ▶@JsonInclude란?@JsonInclude는 Jackson 라이브러리에서 제공하는 어노테이션으로, JSON 직렬화 과정에서 특정 필드를 직렬화할지 말지를 결정하는 역할을 한다. 예를 들어, 객체의 특정 필드가 null이거나 기본값일 때 그 필드를 JSON에 포함할지 여부를 설정할 수 있다. 이 기능은 직렬화된 JSON 데이터를 보다 간결하고 효율적으로 만들 수 있으며, API 통신 시 불필요한 데이터를 줄이는 데 큰 도움이 된다.기본적으로 @JsonI..
FACADE 패턴은 시스템의 복잡한 부분을 감추고, 단순화된 인터페이스를 제공함으로써 사용자가 쉽게 사용할 수 있도록 돕는 디자인 패턴이다. 이번 개발일지를 통해 FACADE 패턴의 개념을 학습하고 이를 실제 코드에 어떻게 적용할 수 있는지 이해해보려고 한다. ▶FACADE 패턴?FACADE 패턴은 복잡한 서브 시스템이나 여러 클래스들로 구성된 코드를 단순화하기 위해 사용하는 디자인 패턴이다. 이 패턴은 여러 개의 클래스들이 서로 복잡하게 상호작용하는 시스템을 단순하게 사용할 수 있는 단일 인터페이스를 제공한다. 복잡한 내부 구조를 숨기고 외부에서는 단순한 메서드 호출만으로도 다양한 기능을 사용할 수 있게 만들어 준다.이 패턴의 목적은 코드의 복잡성을 줄이고 유지보수성을 높이는 것이다. 개발자가 직접 여..
Spring Security를 사용하면서, 한 유저에게 부여된 권한에 따라 접근 가능한 URL을 나누고자 한다. 예를 들어, guest, user, admin과 같은 권한을 나눠서, user 권한이 있는 사람만 접근할 수 있는 URL에 guest 이용자가 접근하지 못하게 제한하고 싶다. 이 문제를 해결하기 위한 방법으로 몰랐던 방식을 알게됐고, 그 방법에 대한 의견을 정리하면서 이 개발일지를 작성하게되었다. SecurityConfig에서 경로별 접근 제한 설정@PreAuthorize 어노테이션을 사용한 메서드 단위 접근 제한▶첫 번째 방법: SecurityConfig 파일에서 경로 제한 설정첫 번째 방법은 SecurityConfig 파일에서 URL 경로별로 접근 권한을 설정하는 것이다. 스프링 시큐리티에..
확장성과 오버엔지니어링.이 두 개념은 개발자로서 코드 설계를 고민할 때 자주 맞닥뜨리게 되는 문제이지만, 초입자인 내가 이해하기엔 어려운 주제였다. 이번 개발일지를 통해 확장성과 오버엔지니어링이 무엇인지 학습하고, 이 두 개념의 균형을 어떻게 잡아야 하는지 이해하려고 한다. ▶ 확장성(Scalability)이란?확장성(Scalability)이란 소프트웨어 시스템이나 코드가 성장하는 요구사항에 맞추어 쉽게 확장될 수 있는 능력을 의미한다. 여기서 확장성은 단순히 더 많은 기능을 추가하는 것뿐만 아니라, 현재의 코드 구조를 크게 변경하지 않고도 요구사항에 유연하게 대응할 수 있는 것을 말한다. 예를 들어, 특정 기능이 추가될 때 기존 코드를 크게 수정하지 않고 새로운 기능을 쉽게 추가할 수 있다면 그 코드의..