@RequestBody Json 데이터 바인딩Frontend에서 Http Body에 Json 데이터를 담아서 보내면, Spring Boot Controller의 @RequestBody로 객체로 바인딩된다. 결론부터 말하자면 아래의 방법 중 하나로 바인딩 한다.기본 생성자 + Setter전체 필드 생성자 + @JsonCreator필드 직접 접근HttpMessageConverterSpring은 @RequestBody가 붙은 파라미터를 처리할 때 내부적으로 HttpMessageConverter를 사용한다.HandlerMethodArgumentResolver → RequestResponseBodyMethodProcessor → HttpMessageConverter 순으로 요청을 처리한다.JSON String은 ..
Java Stream APIJava의 Stream API는 선언적이고 간결한 방식으로 데이터 처리 로직을 구성할 수 있도록 도와주는 매우 강력한 기능이다. 하지만 Stream은 겉으로 보기엔 단순해 보여도, 내부적으로는 lazy evaluation(지연 평가) 기반의 평가 전략을 사용한다. 이 개념을 제대로 이해하지 못하면, 예상과 달리 불필요한 연산이 수행되어 성능 저하로 이어질 수 있다. 우선 lazy evaluation을 알아보기 전에, Stream 동작 순서를 예측해 보자. 테스트 환경Item을 그대로 반환하지만, sout을 찍어주는 log(Item item) 메서드로 로그를 찍어볼 것이다.@AllArgsConstructor@Getterstatic class Item{ private in..
카르케시안 곱(Cartesian Product) 란?Cartesian 곱은 2개의 테이블을 Join 할 때 모든 조합의 데이터를 생성하는 곱집합을 말한다.예를 들면 User를 참조하고 있는 Order 3개, Payment 5개가 있을 때, 총 15개의 결과가 나온다.아래(더 보기)는 카르테시안 곱을 처음 보는 분들을 위한 쿼리 예제입니다.더보기app_userSELECT * FROM app_user uwhere id = '4a421c1c-8df2-4ef2-845d-07d9a216c114';ordersSELECT * FROM orderswhere user_id = '4a421c1c-8df2-4ef2-845d-07d9a216c114';paymentSELECT * FROM paymentwhere user_id ..
Spring의 Cache 추상화개발을 하다 보면, 동적으로 변하진 않는데, 자주 필요한 데이터들을 조회하는 API를 호출할 일이 종종 있다. 간단한 예시로 아래와 같은 상황이 있을 수 있다.Frontend에서 select-box의 값을 채우기 위한 data List 조회외부 API에서 특정 데이터를 조회하는데, 외부 API에서 제공하는 데이터의 갱신 주기가 길 때자주 호출되는 데이터이지만, 실시간으로 변하는 값이 아닐 때Spring은 자주 호출되는 메서드의 실행 결과를 캐시에 저장하고, 이후 동일한 요청이 들어오면 캐시 된 값을 반환하여 응답 속도를 높이고 시스템 부하를 줄일 수 있도록 캐싱 기능을 추상화하여 제공한다.캐시 구현체와 무관하게 사용할 수 있도록 @Cacheable, @CacheEvict, ..
복합키(Composite key)관계형 데이터베이스에서 복합키(Composite Key)란, 두 개 이상의 컬럼을 조합하여 하나의 기본 키(Primary Key)로 사용하는 것을 의미한다. 단일 컬럼만으로는 데이터의 고유성을 보장할 수 없을 때, 여러 컬럼을 묶어 하나의 키로 사용하는 방식이다. 아래 테이블처럼, 주문번호와 상품번호 두개를 묶어야 하나의 고유한 key가 되는 경우를 말한다.이런 경우에 JPA에서 단일키를 사용할 때보다 복잡하고, 귀찮은 작업이 필요하다. 복합키가 꼭 필요하지 않다면, 단일키 전략을 사용하는 것이 낫다고 생각하지만,이미 존재하는 테이블을 엔티티 매핑 해야할 때가 있을것이다.복합키 매핑 시 특징key class에 Serializable을 구현해야된다.key class에 equ..
NuxtLink 개요는 Vue Router의 와 html의 태그를 모두 대체하는 Nuxt3의 내장 컴포넌트이다.내부 링크와 외부 링크를 자동으로 구분하고, 최적화를 사용하여 링크를 렌더링 한다.NuxtLink는 내부 링크인지 외부 링크인지 자동으로 감지하고 적절한 방식으로 처리합니다.내부 링크 (/main 같은 경로)는 Vue Router를 사용해 클라이언트 사이드 내비게이션을 수행합니다.외부 링크 (https://example.com)는 일반적인 태그로 렌더링 됩니다.내부 라우팅이렇게 내부 경로의 /main으로 설정되어 있는 경우, 내부의 다른 페이지에 연결한다. Main Page 외부 라우팅이렇게 외부 경로 url이 설정되어있는 경우, 외부 웹사이트에 연결한다. Nuxt Doc..
definePageMeta()pages/ 디렉터리에 있는 페이지 컴포넌트에 대한 메타데이터를 설정하는 데 사용할 수 있는 컴파일러 매크로 함수이다. 주요 요소들은 아래와 같다.definePageMeta로 정의한 메타데이터의 주요 요소 • alias여러 URL을 동일한 페이지로 연결할 수 있도록 별칭을 지정합니다. • keepalive페이지를 로 감싸 상태를 유지하도록 설정합니다. • key의 렌더링을 제어하기 위한 키 값을 설정합니다. • layout페이지에 사용할 레이아웃을 지정합니다. false로 설정하면 레이아웃을 비활성화할 수 있습니다. • layoutTransition / pageTransition페이지 및 레이아웃 변경 시 사용할 전환 효과를 설정합니다. • middleware페이지를 로드하기..