Spring/Study
-
QueryDsl 페이징 최적화 PageImpl vs PageableExecutionUtils 차이Spring/Study 2023. 11. 14. 01:07
PageImpl vs PageableExecutionUtils return PageableExecutionUtils.getPage(result, pageable, countQuery::fetchOne); return new PageImpl(result, pageable, count); 둘의 차이는 무엇일까? 상황 예시 24개의 content가 존재한다고 가정해보자 PageSize = 10 이라고 하면 페이지는 1,2,3 페이지가 존재하게 된다. 1, 2 페이지에서는 10개의 content가 채워져서 페이지 result가 반환되기 때문에 PageImpl, PageableExecutionUtils 둘 다 count 쿼리가 발생한다. 그런데 3페이지 마지막 페이지에서는 차이가 발생한다. 3페이지에서는 4개의 ..
-
[Spring Boot] mockMvc를 통해 담겨오는 HttpOnly Cookie 내용물 검증하는 테스트 코드 작성법Spring/Study 2023. 7. 23. 23:10
JWT 토큰을 사용하여 로그인을 하면 Access토큰과 Refresh토큰을 응답으로 주는데, 이때 Refresh토큰을 HttpOnly 쿠키로 전달하는 상황이다. 프론트 측에서는 담겨오는 쿠키를 임의로 설정할 수 없으므로 좀 더 보안에 유리하다고 생각한다. 개발 단계에서 이를 검증하기 위해서 mockMvc를 통해 테스트 코드를 작성하는데 body에 담겨오는 값들은 jsonPath를 통해 검증을 진행할 수 있지만, 헤더에 담겨오는 HttpOnly 쿠키는 따로 옵션이 설정되어 값 + 옵션 값까지 동시에 전달된다. 그렇다면 테스트 코드를 어떻게 작성을 해야 하는가? 에 대한 해결 방법이다. 가장 먼저 테스트 코드는 given when then 패턴으로 작성하였다. when까지의 패턴 코드이다 when 까지의 코..
-
[Spring] WebFlux에서 이미지 로드 구현하기Spring/Study 2023. 7. 12. 17:27
WebFlux에서 이미지 로드 구현하기 목적 WebFlux로 구현하는 프로젝트 목적에 따라 이미지를 프론트 쪽에서 사용하게 되었는데, 이 이미지를 서버에서 전송해주기로 했다. 문제점 여기서 icon과 line 이라는 2가지 폴더로 나뉘게 되는데, icon 폴더에는 svg 형태의 이미지 파일이 존재하고 line 폴더에는 png 형태의 이미지 파일이 존재한다. 만약 존재하지 않는 파일이라면 서버측에서 500코드로 오류를 응답으로 전송하게 되는데 이를 404 코드로 응답을 해줘야했다. 해결 방법 이들을 따로따로 처리해주기 위해서는 이미지를 전송해줄 때, HttpHeader를 각각 다르게 처리해서 보내줘야 했다. FileNotFoundException으로 인한 500 에러가 발생하므로 DataBuffer로 변환..
-
[Spring Boot][토이 프로젝트] 2. WebClient를 통한 기상청 공공 API 조회 및 @Scheduled를 사용한 자동화Spring/Study 2023. 6. 30. 20:04
https://code-list.tistory.com/75 이전 프로젝트와 이어지는 글입니다. WebClient 사용한 이유 RestTemplate를 사용하여 외부 API를 조회할 수 있었지만, 나중에는 Deprecated 된다는 글이 심심치 않게 보이길래.... https://velog.io/@dailylifecoding/Spring-RestTemplate-wont-Deprecate 그런데 그냥 유언비어라는 이야기도 있었다. 그래도 RestTemplate 보다 DTO 객체로 변환하기도 쉬운 것 같아서 사용해보게 되었다. 사용법 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-webflux' WebClient를 사용하기 위해 web..
-
[Spring Boot][토이 프로젝트] 1. KakaoMap API 백엔드처리 및 테스트 코드 작성Spring/Study 2023. 6. 29. 18:21
토이 프로젝트 설명 목적 본 프로젝트의 목적은 첫 번째로 프론트의 카카오 맵 API 활용을 연습하려는 목적 백엔드의 지도 API 활용 방법 공부이다. 두 번째로 Controller의 테스트 코드를 작성하기위해 WebMvcTest 활용 방법을 연습했고 세 번째로 기상청 공공 API를 활용한 외부 데이터 수집 방법에 대한 학습을 목적으로 WebClient를 활용했다. 이번 글은 첫 번째와 두 번째의 내용을 정리했고, 추가적인 글을 통해 세 번째의 내용을 정리할 예정이다. 사용한 기술 및 스택 언어 : JAVA 프레임워크 : Spring Boot, JPA, WebFlux 데이터베이스 : H2, MariaDB DevOps : AWS, Docker 라이브러리 : Lombok, H2, MariaDB JDBC, Qu..
-
[Transaction] 트랜잭션 정리 - 1Spring/Study 2023. 6. 16. 15:55
본 정리는 Spring Boot와 연관지어 정리한 것입니다. 1. Transaction 1-1. 사전적 의미 트랜잭션의 사전적 의미는 "거래"이다. A가 B에게 송금하고, B는 A에게 입금을 받는다. 이 행위를 통틀어서 거래라고 한다. 1-2. 개념 커밋 Commit A의 송금과 B의 입금 두 행위 모두 성공하게 된다면? 데이터 베이스에 정보를 저장한다. 데이터베이스에 저장(반영)하는 것을 커밋(Commit) 이라고 한다. 롤백 Rollback 만약 A의 송금은 성공했는데, B의 입금 행위는 실패한다면? 커밋을 하면 안되고 A의 송금 행동을 되돌려야 할 것이다. 이 되돌리는 것을 롤백(Rollback) 이라고 한다. 1-3.트랜잭션 ACID 트랜잭션은 ACID라고 하는 Atomicity, Consiste..
-
[DBCP] 데이터베이스 커넥션 풀 간단 정리: Database Connection PoolSpring/Study 2023. 6. 14. 16:35
본 정리는 Spring Boot와 관련지어 정리한 내용이다. Database Connection Pool Database Connection Pool이 필요한 경우? 유저가 특정 서비스를 요청했을 때, 서비스가 서버에서 DB에 접근을 해서 처리를 해야 하는 서비스라면? 서버는 DB에 연결을 하기위해 TCP/IP 연결을 수행한다. 이때 3-way 핸드셰이크도 수행하게 될 것이다. 그렇게 되면 데이터 베이스에서 SQL을 실행시키는 시간 + 연결 시간이 소요된다. 매번 연결하는 시간이 진행된다면 매우 비효율적이기 때문에 서버와 DB간의 커넥션을 미리 저장 해놓는 공간이 데이터베이스 커넥션 풀이다. 어떻게 동작하는가? 서버가 시작하는 시점에 기본적으로 설정된 커넥션을 미리 확보해서 서버가 보관해둔다. Sprin..
-
[Spring Boot] @RestController와 @ContollerSpring/Study 2023. 5. 26. 21:20
서론 Spring Boot에서 중요한 컨트롤러를 구현할 때 사용되는 두 가지 어노테이션 @RestController와 @Controller에 대하여 간략히 정리하겠다. @Controller @Controller 어노테이션은 해당 클래스가 컨트롤러의 역할을 하도록 스프링에게 알려주는 역할을 한다. 이를 통해 프런트컨트롤러 (Dispatcher Servlet)가 해당 클래스를 사용하여 요청을 처리하며, 일반적으로 뷰에 대한 정보를 전달하는 용도로 사용된다. 메소드에 @ResponseBody 어노테이션이 없다면, 값을 리턴할 때 문자열로 리턴되어 View의 이름으로 매칭되어 실행된다. @RestController @RestController는 @Controller와 @ResponseBody 어노테이션의 조합버..