전체 글 652

RequestBody VS ModelAttribute의 차이점을 말해주세요.

이들은 클라이언트 측에서 보낸 데이터를 Java 객체로 만들어주는데 RequestBody 는 요청의 본문(Body)에 있는 값을 바인딩할 때 사용하고, ModelAttribute 는 요청 파라미터나 multipart/form-data 형식을 바인딩할 때 사용합니다.RequestBody클라이언트가 보내는 요청의 본문을 자바 객체로 변환합니다.내부적으로 HttpMessageConverter를 거치는데, 이때 ObjectMapper를 통해 JSON 값을 java 객체로 역직렬화합니다.따라서 변환될 java 객체에 기본 생성자를 정의해야 하고, getter나 setter를 선언해야 합니다. 참고cf. record에 기본 생성자를 따로 정의하지 않았는데 역직렬화가 되는 이유record 는 기본생성자를 자동으로 제..

“모놀리식 → 멀티모듈(여전히 한 프로세스)”생기는 문제들

1. 경계가 흐릿해짐모듈 간 순환 의존, 공용 util 남용, 도메인 객체를 그대로 넘기며 레이어 침식.Shared DB 테이블을 서로 직접 건드리며 트랜잭션 경계가 꼬임.2. 의존성/빌드 지옥transitive dependency 충돌, BOM 부재로 버전 드리프트.멀티모듈 빌드 캐시/평행 빌드 미설정으로 빌드 시간 폭증.리소스/Bean 이름 충돌(동일 이름의 application.yml, message, Bean name 등).3. Spring 특유의 함정광범위한 @ComponentScan 으로 모듈 경계 무시, “우연한” 빈 주입.@Configuration 들이 서로 @Import 하다 모듈 순환.테스트에서 @SpringBootTest 한 방으로 모두 로딩 → 테스트 느려지고 경계 검증 불가.4. ..

스택을 활용하여 브라우저의 뒤로가기/앞으로가기 기능을 구현하는 방법을 설명해주세요.

스택을 활용하면 브라우저의 뒤로가기/앞으로가기 기능을 효율적으로 구현할 수 있습니다. 이를 위해 다음과 같은 두 가지 스택이 필요합니다.backStack (뒤로가기 스택): 사용자가 방문한 페이지들이 차례대로 쌓이며, 가장 위에 있는(top) 페이지가 현재 페이지에 해당합니다. 이 스택은 뒤로가기 기능을 담당합니다.forwardStack (앞으로가기 스택): 뒤로가기를 한 뒤 다시 앞으로 이동할 수 있도록 이전에 방문했던 페이지들을 보관합니다.이 두 스택을 활용한 동작 흐름은 다음과 같습니다.1. 새로운 페이지 방문 시현재 페이지를 backStack에 push합니다.이전의 forward 경로는 더 이상 유효하지 않으므로 forwardStack은 초기화됩니다.2. 뒤로가기 버튼 클릭 시현재 페이지를 bac..

ControllerAdvice에 대해 설명해주세요

@ControllerAdvice는 모든 컨트롤러에 대해 전역 기능을 제공하는 애너테이션입니다. @ControllerAdvice가 선언된 클래스에 @ExceptionHandler, @InitBinder, @ModelAttribute를 등록하면 예외 처리, 바인딩 등을 한 곳에서 처리할 수 있어, 코드의 중복을 줄이고 유지보수성을 높일 수 있습니다. @ControllerAdvice는 내부에 @Component가 포함되어 있어 컴포넌트 스캔 과정에서 빈으로 등록됩니다. @RestControllerAdvice는 내부에 @ResponseBody를 포함하여 @ExceptionHandler와 함께 사용될 때 예외 응답을 Json 형태로 내려준다는 특징이 있습니다.

쿠키와 세션에 대해 설명해주세요.

쿠키와 세션은 클라이언트와 서버 간의 상태를 유지하기 위해 사용하는 대표적인 방식들입니다. 웹은 기본적으로 상태를 저장하지 않는 Stateless한 구조이기 때문에, 사용자의 로그인 정보나 장바구니와 같은 클라이언트 정보를 유지하려면 별도의 상태 관리 방식이 필요합니다. 이때 주로 활용되는 방식이 쿠키와 세션입니다.먼저, 쿠키는 클라이언트 측에 저장되는 데이터입니다. 서버가 클라이언트에게 응답할 때 Set-Cookie 헤더를 통해 데이터를 전달하고, 이후 클라이언트는 요청 시 해당 쿠키를 자동으로 포함하여 서버로 전송하게 됩니다. 쿠키는 브라우저에 저장되기 때문에 서버에서는 별도의 저장 공간을 차지하지 않으며, 지속적인 상태 유지가 가능합니다. 유효 기간을 설정하여 자동 만료되도록 할 수도 있습니다. 쿠..

@Controller 와 @RestController 의 차이점을 설명해주세요.

이 두 어노테이션의 주요 차이점은 HTTP 응답의 처리 방식에 있습니다.@Controller주로 뷰(View)를 반환하는 컨트롤러를 정의할 때 사용됩니다. 메서드가 반환하는 값은 뷰 리졸버(View Resolver)에 의해 해석되어 JSP, Thymeleaf 등과 같은 템플릿 엔진을 통해 HTML을 생성합니다.@RestController주로 RESTful 웹 서비스 API를 정의할 때 사용됩니다. 메서드가 반환하는 값은 자동으로 JSON 또는 XML 형식으로 변환되어 HTTP 응답 본문에 포함됩니다. 이는 @Controller와 @ResponseBody의 결합된 형태입니다.

Spring MVC의 실행 흐름에 대해 설명해주세요.

클라이언트로부터 HTTP 요청이 들어옵니다. 이때 DispatcherServlet이 프론트 컨트롤러의 역할을 수행합니다.HandlerMapping을 통해 URL에 매핑된 핸들러를 조회합니다.DispatcherServlet은 찾은 핸들러를 실행하기 위해 HandlerAdapter를 사용합니다.HandlerAdapter가 실제로 요청을 처리하는 메서드를 호출합니다.컨트롤러는 결과 데이터를 Model 객체에 담고, View 이름을 반환합니다.ViewResolver는 View 이름을 기반으로 적절한 뷰를 찾습니다.ViewResolver가 찾은 뷰를 사용해 최종적으로 HTML과 같은 응답을 생성합니다.[Message Converter의 동작]JSON과 문자열 등을 응답하는 경우는 View를 응답하는 경우와 유사한..

예상치 못하게 외부 라이브러리의 버그로 인해 기능에 문제가 생겼다면, 어떤 절차로 해결하실 건가요?

외부 라이브러리가 간혹 예상치 못한 버그나 비정상적인 동작으로 인해 전체 기능에 영향을 주는 경우가 있습니다. 이럴 때 단순히 라이브러리를 비난하기보다는, 문제의 원인을 명확하게 파악하고, 영향도를 분석한 뒤, 가능한 범위 내에서 안정적인 대응 전략을 택하는 것이 중요합니다.먼저 가장 우선적으로 해야 할 일은 문제가 발생한 원인을 확실히 좁히는 작업입니다. 예를 들어, 최근에 라이브러리 버전이 변경되었는지 확인하거나, 특정 컴포넌트에서만 문제가 발생하는지 등을 확인해 문제 범위를 좁힙니다. 이 과정에서 Git 히스토리나 GitHub 이슈를 참고하면 도움이 됩니다. 이를 통해 실제로 버그가 해당 라이브러리에서 기인한 것인지, 아니면 잘못된 사용 방식 때문인지를 명확하게 구분합니다.다음으로는 해당 문제가 사..

다음 리액트 코드의 실행 순서에 대해 설명해주세요.

아래의 코드에서 최초 마운트 및 버튼 클릭 시, console.log가 어떤 순서로 출력되는지 설명해주세요. 🙂import { useState, useEffect } from 'react';function Parent() { const [count, setCount] = useState(0); console.log('1'); useEffect(() => { console.log('2'); return () => { console.log('3'); }; }, [count]); return ( 카운트: {count} setCount((prev) => prev + 1)}>+1 );}function Child({ value }) ..

Filter와 Interceptor의 차이점을 말해주세요.

FilterFilter는 요청 및 응답의 전처리와 후처리를 수행하고 서블릿 컨테이너에 의해 실행되는 Java 클래스입니다. 주로 요청 로깅, 인증, 인코딩 설정, CORS 처리, 캐싱, 압축 등의 공통 기능을 구현하는 데 사용됩니다.특징Filter는 서블릿 컨테이너(예: Tomcat) 수준에서 동작합니다. 모든 요청이 서블릿으로 전달되기 전에 Filter를 거칩니다.생명 주기: Filter는 doFilter 메서드를 통해 요청 및 응답을 처리합니다. FilterChain을 통해 다음 필터 또는 최종 서블릿으로 요청을 전달합니다.순서: web.xml이나 @WebFilter 애노테이션을 통해 설정할 수 있으며, 필터의 순서는 설정 파일에서 정의합니다.InterceptorInterceptor는 특정 핸들러 메..