[Spring] SOLID 원칙에 대해 알아보자
·
Java/Spring
SOLID 원칙이란 좋은 객체 지향 설계를 하기 위한 5가지 원칙입니다. SRP, OCP, LSP, ISP, DIP 총 5가지가 있는데, 이 원칙에 대해 알아보도록 하겠습니다. 1. SRP(Single Responsibility Principle, 단일 책임 원칙) 한 클래스는 하나의 책임을 가져야 하는 원칙 변경이 있을 때, 변경에 대한 파급효과가 적으면 SRP를 준수하고 있다는 것입니다. 2. OCP(Open/Closed Principle, 개방-폐쇄 원칙) 소프트웨어 요소는 확장에는 열려 있어야 되지만, 변경에는 닫혀 있어야 하는 원칙 (다형성) 다형성은 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있어야 하는 개념입니다. 클라리언트를 변경하지 않으면서, 서버의 구현 기능을 ..
[Spring] CORS(Cross-Origin Resource Sharing) 에러 해결
·
Java/Spring
프로젝트에서 프론트 팀원분께서 api 연동을 하려는데 이러한 에러가 뜬다고 말씀해 주셨습니다. Access to XMLHttpRequest at 'http://ip주소/api/matches' from origin 'http://127.0.0.1:5173' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource 주어진 에러 메세지는 브라우저에서 발생한 CORS 관련 오류입니다. 서버에서 CORS 정책이 적절하게 구성되지 않은 경우에 클라이언트에서 요청한..
[Spring] Swagger3.0 버전 Authorize button 설정
·
Java/Spring
인증(Authentication), 인가(Authorization)에 대해 설명드리겠습니다. 인증은 클라이언트 측에서 서버 측으로 요청한 사용자 정보가 올바른지 확인하는 과정입니다. (Login) 인가는 요청에 대한 권한이 있는지 판단하는 과정입니다. 만약 클라이언트의 요청에 대한 권한이 없다는 경우, HTTP 403(Forbidden) 상태 코드를 반환하게 됩니다. 클라이언트는 서버로부터 전달받은 토큰을 관리하며, Authorization Header에 Jwt 토큰을 담아 관리하게 됩니다. Postman과 같은 툴에서는 서버로 요청을 보낼 때, 매번 Bearer Token에 토큰 정보를 담아줘야 하는 불편함이 있습니다. 하지만, Swagger에서 Authorize 버튼에 관련한 설정을 활성화시킨다면 A..
[Spring] LocalDateTime 형식의 데이터를 @JsonFormat, @DateTimeFormat어노테이션을 적용하여 데이터 주고받기
·
Java/Spring
팀플을 하던 도중 DB에서 데이터를 주고받는 경우 날짜 형식이 Array 형식인데, String으로 바꿀 수 없냐는 프론트측에서 질문을 받았습니다. 그래서 LocalDateTime을 String으로 어떻게 바꾸면 좋을지 생각하던 구글링 하던 도중 좋은 포스팅을 발견했습니다. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=varkiry05&logNo=221736856257 [spring] LocalDateTime 주고받기(Response, Request) 데이터베이스에서 날짜데이터를 로드할 때 날짜형식의 String 형태으로 구성하여 전달하는 경우가 있다. (... blog.naver.com Response에서는 클라이언트 측의 요..
[Spring] 이메일 인증을 구현하기 위한 설정 (SMTP, mail.properties)
·
Java/Spring
오늘은 Spring 기반으로 회원가입 시 이메일 인증 코드를 발급해 주는 기능을 구현해보려고 합니다.해당 기능을 구현함으로써 보안성을 강화하고, 서비스의 신뢰성을 높일뿐더러, 스팸 및 악성 가입을 방지할 수 있습니다. 또한 Spring에서는 JavaMail 모듈이 워낙 잘 되어 있어서 해당 모듈을 활용해야겠다고 생각했습니다.  SMTP를 이용하여 메일 서버를 구축하고, 해당 프로젝트 내에서 MailConfig, mail.properties 설정을 통해 구현하는 과정에 대해 상세히 설명드리도록 하겠습니다. SMTP (Simple Mail Transfer Protocol)인터넷을 통해 이메일을 보내고 받는 데 사용되는 통신 프로토콜 Spring Mail ModuleJavaMail API를 추상화하여 편리한 ..
[Spring] N+1 문제를 해결하기 위한 방안 (fetch join, @EntityGraph)
·
Java/Spring
코드를 보면서 N+1 문제와 이를 해결하기 위한 방안에 대해서 설명드리겠습니다. @Test public void findMemberLazy() throws Exception { //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 20, teamB)); em.flush(); em.clea..
[Spring] Spring Data JPA Paging, Sort 기능
·
Java/Spring
Spring Data JPA는 기본적으로 페이징 기능과 정렬 기능을 제공하고 있습니다. 이들을 사용하기 위해서는 Pageable, Sort 객체가 필요합니다. org.springframework.data.domain.Sort : 정렬 기능 org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함) Pageable 객체에는 페이지 번호, 페이지 크기, 정렬 정보를 가지고 있습니다. @GetMapping("/users") public ResponseEntity getUsers( @RequestParam(defaultValue = "0") Integer pageNo, @RequestParam(defaultValue = "10") Integer pageSi..
[Spring] Spring Data JPA 공통 인터페이스
·
Java/Spring
구조적으로 JpaRepository는 공통 CRUD기능을 제공하고 있습니다. 그래서 생성한 Repository 인터페이스를 통해 기본적인 CRUD 기능을 구현하지 않아도 사용할 수 있습니다. 이제 공통 인터페이스에 대해 알아보겠습니다. JpaRepository 공통 기능 인터페이스 public interface JpaRepository extends PagingAndSortingRepository JpaRepository를 사용하는 인터페이스 public interface MemberRepository extends JpaRepository { } @Repository 어노테이션을 생략할 수 있는 이유는 Spring Data JPA가 자동으로 컴포넌트 스캔을 처리하고, JPA 관련 예외도 처리해 주기 때..
[Spring] Querydsl
·
Java/Spring
Queryds이란 무엇인가? 백엔드 기술은 주로 스프링 부트, 스프링 데이터 JPA를 조합해서 사용합니다. 하지만, 이러한 기술들로도 해결하지 못한 문제들이 있습니다. 바로 복잡한 쿼리, 동적 쿼리와 같은 문제들을 해결할 수 없습니다. 이러한 문제들을 손쉽게 해결할 수 있는 기술이 Querydsl입니다. Querydsl은 HQL(Hibernate Query Language) 쿼리를 안전하게 생성 및 관리해 주는 프레임워크입니다. 또한 쿼리를 자바 언어의 한계를 넘어서 자바 코드로 작성함과 더불어, 문법 오류를 컴파일 시점에 시점에 잡아줍니다. 문법이 SQL과 유사하기에 쉽게 학습할 수 있고, 복잡한 쿼리도 손쉽게 작성할 수 있게 됩니다. JPQL과의 차이를 통해 장점을 설명드리겠습니다. @Test pub..
[Spring] OSIV[Open Session In View]를 적절히 사용하여 성능 최적화
·
Java/Spring
OSIV란 무엇인가? 하이버네이트에서 Open Session In View라고 불렀고, 향후 JPA가 생기고 나서는 Open EntityManager In View라고 불렀습니다. 관례상 OSIV라고 합니다. OSIV는 하이버네이트를 뷰까지 열어두는 기능입니다. spring.jpa.open-in-view : true(기본 값) 다음과 같이 애플리케이션을 시작 시점에 warn로그를 뿌립니다. 이제 그 이유에 대해서 알아보겠습니다. OSIV 전략은 최초 데이터베이스 연결 시작 시점부터 API 응답이 끝나기 전 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지하게 됩니다. 그래서 View 템플릿이나 API 컨트롤러에서 지연로딩이 가능해왔습니다. (지연 로딩(LAZY)가 가능하려면 영속성 컨텍스트가 살아 있어야..