전체 글 279

Buyme TIL240828 jpa 쿼리오류 / docker-compose 환경설정 / 로컬의 properties , docker-compose 환경설정 관련 학습

order-server gradle build 시 코드에러 전문OrderServiceApplicationTestsall > com.example.buyme.order > OrderServiceApplicationTests1tests1failures0ignored0.005sduration0%successfulFailed testsTestsStandard outputStandard error00:40:25.713 [Test worker] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [com.ex..

Buyme TIL240827 MSA 환경에서 api gateway 를 통한 데이터 통신

멀티 모듈 화 후 API 게이트를 통해 각 모듈을 연결할 때, 전환된 환경에서 다른 모듈에 있는 엔티티를 직접 참조할 수 없는경우, 어떤 방법을 사용하는게 좋은지?방법은 크게 3가지가 있다.REST API 를 통한 정보조회RestTemplateWebClient현재 MSA 환경에서 API 게이트웨이를 통해 다른 독립적인 (세분화된) 서비스들과 통신을 하는 것이기 때문에, REST API (http response)를 통해서 하는 것이 맞다. MSA 환경에서 order-service 를 쓰는데, Product 정보가 필요한 경우를 예상해보자  1. WebClient.Builder 사용을 위한 의존성 추가dependencies { implementation 'org.springframework.boot:..

Buyme TIL240826 멀티모듈 통신오류

첫번째, Execution failed for task ':bootJar' 라는 오류가 발생했다.이는 org.springframework.boot:spring-boot-dependencies:3.3.2 외부 종속성을 해결할 수 없어서 발생하는 오류로, 모노리스 서비스를 멀티모듈화 하면서 엔티티 등의 결합 관계가 제대로 정립되지 않아 발생하였다. 일부 엔티티 연결등을 통해 해당 오류를 해결했다.   두번째,docker-compose up --build  를 통해 빌드업을 하는 중 다음과 같은 에러가 발생했다,=> [order-service build 3/5] COPY ../../ ./ ..

N+1 문제의 발생 이유와 해결 방법에 대해 설명해주실 수 있을까요? 해결 방법은 3가지 이상

N+1 문제는 ORM(Object-Relational Mapping) 프레임워크에서 자주 발생하는 성능 문제 중 하나로, 주로 여러 개의 연관된 엔터티를 로드할 때 발생합니다.발생 이유:예를 들어, 하나의 엔티티(예: Order)를 조회할 때, 이 엔티티와 연관된 다른 엔티티(예: OrderItem)를 조회하기 위해 추가적인 쿼리가 발생합니다.만약 Order 1개에 대해 OrderItem을 N개 가져와야 하는 상황이라면, 첫 번째 Order를 가져오는 1번의 쿼리 외에 각 OrderItem을 가져오기 위한 N번의 쿼리가 추가로 발생하게 됩니다.즉, 총 N+1번의 쿼리가 실행되므로 데이터베이스 부하가 증가하고 성능이 저하됩니다. 해결 방법:즉시 로딩 (Eager Fetching) 또는 지연 로딩 (Lazy..

기술면접 준비 2024.08.20

Spring Security의 구조와 JWT 발급 과정에 대해 설명해주실 수 있을까요?

Spring Security는 Spring 애플리케이션에서 인증과 권한 부여를 담당하는 프레임워크입니다. Spring Security의 주요 구조와 JWT 발급 과정은 다음과 같습니다:  Spring Security의 구조:SecurityContext:현재 사용자(Principal)에 대한 보안 정보를 저장합니다.SecurityContextHolder를 통해 어디서나 접근할 수 있습니다.Authentication:사용자의 인증 정보를 나타내며, Principal, Credentials, Authorities 등을 포함합니다.AuthenticationManager:사용자 인증을 처리하는 인터페이스입니다.일반적으로 ProviderManager가 구현체로 사용되며, 여러 AuthenticationProvide..

기술면접 준비 2024.08.20

Annotation이란 무엇이고 구체적으로 어떤 것이 있는지 예시를 들어 설명해주실 수 있을까요?

Annotation은 메타데이터의 일종으로, 주로 소스 코드에서 클래스, 메서드, 필드 등에 추가적인 정보를 제공하기 위해 사용됩니다. 주석처럼 코드 실행에 직접적인 영향을 주지 않지만, 컴파일러나 런타임에 의해 해석되어 특정 동작을 수행할 수 있게 합니다.Annotation은 주로 다음과 같은 역할을 합니다:컴파일러 지시: 코드 작성 시 컴파일러에게 특정 경고를 무시하게 하거나, 코드에 오류가 있는지 검사하도록 지시할 수 있습니다.런타임 처리: 런타임에 리플렉션을 통해 Annotation 정보를 읽어 동작을 제어할 수 있습니다.코드 문서화: 코드에 대한 메타정보를 추가하여, 코드가 어떤 역할을 하는지 명확히 할 수 있습니다.주요 Annotation 예시:@Override:메서드 위에 사용되며, 부모 클..

기술면접 준비 2024.08.20

Buyme TIL240816 모노리스 서비스를 MSA 로 구조화하기 - 멀티모듈화 / (트러블슈팅) 콘텐츠 루트 충돌 문제

유저 / 상품 / 주문 으로 구성된 현재의 모노리스 서비스를 마이크로서비스로 분리하고, 각 마이크로서비스 간의 통신 및 데이터베이스 연동을 구현하고자 한다. 그러기 위해서, 첫번째로 멀티 모듈 디펜던시 관리를 하고자 하였다. 즉, 첫번째로 해야 할 작업은 모노리스 서비스를 멀티 모듈화 하는 것이다. 멀티 모듈 디펜던시 관리는 큰 규모의 프로젝트에서 모듈 간의 의존성을 체계적으로 관리하기 위해 필요하다. 모듈화는 코드의 재사용성과 유지보수성을 향상시키지만, 각 모듈이 서로 올바르게 의존하고 독립적으로 배포되려면 모듈 간의 의존성을 효과적으로 관리해야 한다. 여기서 모듈은 하나의 실행 또는 배포 가능한 어플리케이션 일 수도 있고, 특정 기능을 담은 컴포넌트일 수도 있다. 모든 코드를 user-service ..

Buyme TIL240813 기술적 의사결정 - 주문 상태 및 반품 상태의 세분화와 Enum 사용

주문 및 반품 상태를 세분화한다는 것은 주문과 관련된 각 상태를 보다 명확하게 정의하여, 상태 전이를 쉽게 관리하고 추적할 수 있도록 하는 것을 의미한다. 예를 들어, 주문은 여러 단계의 상태를 거칠 수 있으며, 각 상태를 명확히 정의해두면 코드의 가독성과 유지보수성이 크게 향상된다.  Enum을 사용하는 이유명확한 상태 관리: 각 상태를 Enum으로 정의하면, 코드에서 특정 상태를 쉽게 이해하고 관리할 수 있다.안전성: Enum은 상수의 집합이기 때문에, 잘못된 상태 값을 사용할 가능성을 줄인다.가독성: 상태를 문자열로 처리하는 대신, Enum으로 정의하면 코드의 가독성이 향상된다.

MVC 모델이란 무엇인지 설명해주실 수 있을까요?

MVC(Model-View-Controller) 모델은 애플리케이션의 구조를 세 가지 주요 컴포넌트로 분리하여 관리하는 소프트웨어 디자인 패턴입니다. 이는 애플리케이션의 유지보수성과 확장성을 높이는 데 중요한 역할을 합니다. Model: 모델은 애플리케이션의 데이터와 비즈니스 로직을 관리합니다. 데이터베이스와의 상호작용, 비즈니스 규칙 처리 등이 모델의 책임입니다. 모델은 데이터를 변환하거나 가공하여 뷰에 제공할 준비를 합니다. View: 뷰는 사용자 인터페이스를 담당합니다. 사용자가 볼 수 있는 화면을 구성하며, 모델에서 제공받은 데이터를 기반으로 시각적인 출력을 생성합니다. 뷰는 사용자에게 데이터를 표시하고, 사용자의 입력을 컨트롤러로 전달합니다. Controller: 컨트롤러는 모델과 뷰를 연결하는..

기술면접 준비 2024.08.13

DI와 IoC에 대해 아는 만큼 설명해주실 수 있을까요?

DI(Dependency Injection)와 IoC(Inversion of Control)는 객체 지향 프로그래밍에서 소프트웨어 컴포넌트 간의 결합도를 낮추기 위해 사용하는 개념들입니다.  IoC(Inversion of Control, 제어의 역전): 전통적인 절차 지향 프로그래밍에서는 프로그램의 흐름을 개발자가 직접 제어합니다. 그러나 IoC는 이 흐름의 제어권을 프레임워크나 컨테이너가 대신 가지도록 하여, 개발자가 신경 써야 할 부분을 줄여줍니다. 대표적으로 Spring 프레임워크에서 IoC 컨테이너가 객체의 생성과 생명 주기를 관리합니다.  DI(Dependency Injection, 의존성 주입): DI는 IoC의 구현 방법 중 하나로, 객체가 필요로 하는 의존성을 외부에서 주입하는 방식입니다...

기술면접 준비 2024.08.13