[Spring / JPA] Server-Sent-Events(SSE)와 OSIV
·
Framework & Library/Spring
1. 서론 요즘 대부분 Spring Boot JPA를 많이 사용하고 추가로 SseEmiters로 실시간 알림기능 구현을 하려고 하면 대다수 IOException : Broken Pipe, Connection is not available, request timed out after 30004ms 이런 에러가 발생할 것입니다. 원인은 JPA의 영속성 컨텍스트, OSIV가 true로 설정되서 생기는 문제입니다. 이 글에서는 OSIV가 뭔지 정확히 왜 이런 에러가 생기는 건지 알아보고자 합니다. 2. 프록시 객체와 지연로딩 2 - 1. 프록시란? 프록시는 실제 클래스를 상속 받아서 만들어진 가짜 객체라고 할 수 있습니다. 이러한 프록시 객체는 실제 객채의 참조를 보관하는 특징을 가지고 있어 프록시 객체를 통해..
[Spring] Spring Boot Redis 사용하기 / 이메일 인증 유효시간
·
Framework & Library/Spring
Redis는 key-value 구조로 데이터를 저장하는 In-memory 기반의 데이터베이스 시스템입니다. Spring boot 에선 어떻게 구현하는지 알아봅시다. 1. 먼저 Redis란? 먼저 Redis가 어떤건지는 블로그 다른 게시글에 작성해놨습니다. [CS / DataBase] 인메모리 데이터 저장소 Redis, 왜 사용할까? 개발을 하면서 트랜잭션의 속도를 어떻게 하면 줄일 수 있을까? 고민하면서 찾아보면 Redis라는 시스템을 접하게 된다. 그럼 이 Redis는 무엇일까? 1. 레디스(Redis) 란? Redis의 풀네임에서 할 수 있듯 repeater2487.tistory.com 2. Spring Boot에서 Redis 사용하기 2 - 1. 기본 설정 [ 의존성추가 ] 저는 대게 gradle를..
[Java / Spring] @RequestMapping, @PatchVariable 있을때? 없을때?
·
Framework & Library/Spring
Spring으로 API를 만들다보면 @RequestMapping에 @PatchVariable이 있을때도 있고 없을때도 있다. 1. @RequestMapping이란? Spring 개발 시 특정 URL로 요청(Request)을 보내면 Controller에서 어떠한 방식으로 처리할지 정의 이때 들어온 요청을 특정 method와 매핑하기 위해 사용하는 어노테이션 DispatcherServlet이 Controller 파일을 찾고, 논리적 주소가 매핑된 Method를 찾음 @RestController public class MainController { @RequestMapping(value = "/main", method = RequestMethod.GET) public String Main(...) { ... ..
[Java /Spring] SpringBoot Test / TestRestTemplate
·
Framework & Library/Spring
Spring혹은 SpringBoot를 이용하여 RestApi를 설계할 때, 상태코드를 같이 전달하기 위해 ResponseEntity를 사용하는 경우가 많다. 이 문서에서는 이러한 ResponseEntity를 사용하는 RestApi Test환경에 유용하게 사용되는 TestRestTemplate에 대해 알아보자. 📕 TestRestTemplate REST 방식으로 개발한 API의 Test를 최적화 하기 위해 만들어진 클래스이다. HTTP 요청 후 데이터를 응답 받을 수 있는 템플릿 객체이며 ResponseEntity와 함께 자주 사용된다. Header와 Content-Type 등을 설정하여 API를 호출 할 수있다. 📗 예제 1. postForEntity JWT을 사용하는 로그인 Api의 테스트이다. [A..
[Java / Spring] 스프링부트 테스트 어노테이션 @SpringBootTest와 @WebMvcTest
·
Framework & Library/Spring
SpringBoot환경에서 테스트코드를 작성할 때 대다수 JUnit5을 사용하고, @SpringBootTest 어노테이션 혹은 @WebMvcTest를 사용한다. 둘의 차이점을 알아보자 📕 @SpringBootTest 프로젝트의 전체 컨텍스트를 로드하여 빈을 주입하기 때문에 속도가 느리고, 통합 테스트를 할 때 많이 사용한다. 컴포넌트 스캔 범위는 Bean 전체이다. 즉, 애플리케이션이 실행할 당시 스캔되는 범위와 동일하다. 애플리케이션의 모든 설정을 가져오기 때문에 애플리케이션의 범위가 넓을수록 테스트가 느려질 수 밖에 없고, 이는 단위테스트에 적절하지 않다. 📕 @WebMvcTest Web 테스트 중에서 MVC테스트를 하는데 사용하며 컴포넌트 스캔의 범위는 스프링 컨테이너에서 Presentation L..
[Spring / JPA] 일대다 매핑과 빌더 패턴
·
Framework & Library/Spring
📕 JPA의 일대다 매핑 관계 📗 엔티티 설계 다음과 같이 Spiring JPA와 Lombok을 사용한 Member 와 Characters 간 1:N 관계가 있다고 가정을 하자 [Member] @Entity @Getter @Setter @NoArgsConstructor public class Member extends BaseTimeEntity { /** * 회원 목록 테이블 */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private long id; @Column(unique = true) private String username; private String password; @Enumerat..
[Java / Spring] API 문서 자동화 Swagger
·
Framework & Library/Spring
📕 개요 Spring뿐만 아니라 다른 어떤 언어, 프레임워크로 백엔드를 개발했을 때, Rest API를 개발하고 그 API에 대한 문서를 정리하여 해당 API를 사용하는 클라이언트 및 서버 개발자들에게 문서를 정리해서 공유하는것은 필수이다. 기존에는 노션이나 엑셀을 사용하여 정리를 했었는데 이런식으로 노션을 사용해서 정리를 했었는데 단점이 너무 많다. 일일이 코드에서 구현내용, 설계 내용들을 끌고와서 입력해야 한다. api 설계가 바뀌면 노션 문서도 수정해야한다. 그러던중 Swagger에 대해 알게 되었고, 적용해보았다. 📕 Swagger란? Swagger 는 API를 설계하고 문서화 및 테스팅이 가능한 프레임워크이며, 무료 버전과 상용 버전 모두 존재한다. Swagger 에는 아래 5개 기능이..
[Spring / JPA] 엔티티 생성/수정 시각 자동화 Auditing
·
Framework & Library/Spring
엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하는 기능이 대부분 있어야한다. 📕 순수 JPA 사용 📗 등록일, 수정일 [JpaBaseEntity] @MappedSuperclass public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createDate; private LocalDateTime updateDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.now(); createDate = now; updateDate = now; } @PreUpdate public void preUpdate() { updateDate = ..
[Spring / JPA] JPQL을 사용한 코드 리팩토링
·
Framework & Library/Spring
스프링 JPA는 다양한 쿼리 방법을 지원한다. 그 중 JPQL을 쓴 내용을 정리해보았다. 📕 JPQL (Java persistence Query Language) 📗 JPQL 이란? 테이블 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. SQL과 비슷한 문법을 가지며, JPQL은 결국 SQL로 변환된다. JPA에서 제공하는 메소드 호출만으로 섬세한 쿼리 작성이 어렵다는 문제에서 JPQL이 탄생된 것이다. 📗 특징 객체를 검색하는 객체지향 쿼리 SQL을 추상화 했기 때문에 특정 벤더에 종속적이지 않음 JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회 📕 프로젝트 중 활용(로스트아크 숙제 체크) 📗 엔티티 구조 [Content] - 일일 숙제와 주간 숙제를 나누기 위해 ..