Spring - Spring Boot 3.x에서 View 렌더링되지 않는 원인과 해결 방법
·
Spring
배경Spring Boot 3로 프로젝트를 개발하던 중 에러가 발생했다. 간단한 웹 페이지를 JSP로 구현하고 있었는데, 페이지를 열어보니 JSP 화면 대신 Whitelabel Error Page가 나타났다. 컨트롤러에서 main이라는 뷰 이름을 반환했고, 해당 JSP파일도 정확한 위치에 있었다. 그런데 왜 Spring Boot는 JSP를 찾지 못하고 Whitelabel Error Page를 표시하는걸까? build.gradledependencies { ... // JSP implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'..
Spring Boot - Repository 단위 테스트하기(JPA, Querydsl, Mybatis)
·
Spring
유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다.즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다.이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다. - 위키백과 배경현재 내가 일하고 있는 조직에서는 테스트 코드 작성을 하지 않는다. 이로 인해 코드 수정이나 기능을 추가해야 할 때 수동으로 테스트를 진행해야 했다. 작은 변경사항에도 전체 기능을 다시 테스트해야 하는 상황이 자주 발생했고, 이는..
Algorithms - 가중치 랜덤 알고리즘(랜덤 쿠폰 뽑기)
·
Algorithms
배경커머스 플랫폼 개발에서 랜덤 쿠폰 지급 이벤트는 빈번히 요구되는 기능이다. 이러한 이벤트에서는 일반적으로 할인율이 낮은 쿠폰일수록 당첨 확률이 높고, 할인율이 높은 쿠폰일수록 당첨 확률이 낮다. 이를 구현하기 위해 각 쿠폰에 가중치를 부여하고, 랜덤하게 쿠폰을 발행하는 가중치 랜덤 알고리즘(Weighted Random Algorithm)이 사용된다. 이번 포스트에서는 이 알고리즘을 알아보고 실제 구현, 테스트까지 진행해보자.  가중치 랜덤 알고리즘(Weighted Random Algorithm)가중치 랜덤 알고리즘은 각 요소에 가중치를 할당해서 선택 확률을 조절하여 선택하는 알고리즘이다.가중치가 높을수록 선택될 확률이 높고 가중치가 낮을수록 선택될 확률이 낮다. 사용 사례게임 개발: 디아블로 시리즈를..
Spring Boot - Service 단위 테스트하기(JUnit5, Mockito, AssertJ)
·
Spring
유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다.즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다.이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다. - 위키백과 배경현재 내가 일하고 있는 조직에서는 테스트 코드 작성을 하지 않는다. 이로 인해 코드 수정이나 기능을 추가해야 할 때 수동으로 테스트를 진행해야 했다. 작은 변경사항에도 전체 기능을 다시 테스트해야 하는 상황이 자주 발생했고, 이는..
Spring Boot - Controller 단위 테스트하기(JUnit, MockMvc, Mockito)
·
Spring
유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다.즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다.이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다. - 위키백과 배경현재 내가 일하고 있는 조직에서는 테스트 코드 작성을 하지 않는다. 이로 인해 코드 수정이나 기능을 추가해야 할 때 수동으로 테스트를 진행해야 했다. 작은 변경사항에도 전체 기능을 다시 테스트해야 하는 상황이 자주 발생했고, 이는..
JPA - JPA에서 일괄 삭제하는 방법과 주의점 (deleteAllById, deleteAllByIdIn, deleteAllByIdInBatch, Querydsl)
·
JPA
배경현재 프로젝트에서 Mybatis -> JPA로 마이그레이션하는 작업을 하고 있다.기존에 데이터를 일괄 삭제하던 쿼리를 JPA의 deleteAllById 메서드 하나로 쉽게 구현할 수 있었다.하지만 테스트 코드로 테스트를 해보니 내가 의도한 것과 다르게 쿼리가 실행되고 있었다. 내가 생각한 쿼리delete from task where task_id in (?, ?)in 쿼리로 일괄 삭제실제 실행된 쿼리-- 각 ID에 대한 개별 조회select task_id from task where task_id = ?select task_id from task where task_id = ?-- 조회된 엔티티 개별 삭제delete task_id from task where task_id = ?delete task..
JPA - 연관 관계를 위한 불필요한 select 줄이기(getReferenceById())
·
JPA
개요데이터베이스에 연관 관계를 가진 엔티티를 저장할 때, 우리는 종종 연관된 엔티티의 모든 정보를 조회(SELECT)하게 된다. 하지만 이러한 방식은 의문점을 들게한다.'실제로 DB에 저장되는건 연관 객체의 ID뿐인데, 왜 모든 정보를 조회해야 할까?' @Service@Transactional@RequiredArgsConstructorpublic class OrderServiceImpl implements OrderService { private final OrderRepository orderRepository; private final CustomerRepository customerRepository; public void saveOrder(Long customerId) { ..
ajax - 기초 문법
·
etc
서버와 통신 시작  AJAX란?Asynchronous Javascript and XML. 이름에 XML에 들어가지만 최근에는 HTML, JSON을 더 많이 사용한다. 기존 웹은 페이지를 로딩하면 다른 페이지를 로딩하기 위해서는 링크를 타고 넘어가야 했다. (깜빡임이 발생한다.)AJAX 기술을 사용하면 페이지를 전환하지 않고도 다른 화면을 보여줄 수 있다.비동기적으로 서버에 요청을 하기 때문에 페이지의 전환 없이도 새로운 데이터를 가져올 수 있다.대표적으로 ajax를 이용해서 브라우저에 요청을 보내는 방식은 두 가지가 있다. get과 post 방식이다.특징GETPOST캐시화(cached)캐시될 수 있음캐시되지 않음브라우저 히스토리히스토리에 쿼리 문자열이 기록됨히스토리에 기록되지 않음데이터 길이데이..
Querydsl - Expressions클래스로 select에서 상수 사용하는 법
·
JPA
개요쿼리 성능을 개선하는 방법 중 하나는 이미 선언된 값은 그대로 사용하는 것이다.매개변수로 넘어왔구나 이미 알고 있는 값을 DB에서 조회하는건 불필요하다. 이 밖에도 Entity보다 DTO로 필요한 필드만 가져오거나 where 및 join 문에 인덱스가 있는 필드만 사용하는 등의 방법이 있다. 본 글에서는 Expressions 클래스로 Querydsl에서 select문에서 상수를 사용하는 방법을 알아보자com.mysema.query.support.Expressions 클래스는 동적 표현식 생성을 위한 클래스이다. constant()constant 표현식은 Entity에 선언되지 않은 필드를 상수로 반환하고 싶을 때 사용한다.Expressions.constant(value) 형태로 사용할 수 있고 Exp..
Spring Boot - JPA 스키마, 데이터 초기화하기 (SQL script -> ddl-auto)
·
Spring
개요이전에 작업했던 프로젝트를 Mybatis에서 JPA, Querydsl로 마이그레이션하는 작업을 하고 있다.기존 초기화를 script(schema.sql(테이블 생성), data.sql(더미데이터 생성)) 파일을 사용하다가 JPA를 사용하게 되면서 ddl-auto를 사용해 Table 생성하기로 했다.DDL이란?DDL(Data Definition Language)은 SQL의 하위 집합으로 데이터베이스의 구조와 테이블, 뷰, 인덱스 프로시저와 같은 개체를 정의하는데 사용된다. DDL문은 데이터 베이스 개체를 생성, 변경 및 삭제 하는데 사용된다. (CREATE, ALTER, DROP, TRUNCATE, RENAME) 데이터 초기화 설정SQL script (기존) 기존에는 script 기반으로 데이터를 초기..
Cold Bean
'분류 전체보기' 카테고리의 글 목록