Spring-boot

· Spring-boot
최근 팀원과 협업 프로젝트를 진행하는 과정에서 Repository Layer를 구성할 때 일반적으로 사용하는 JPARepository 외에 Repository라는 인터페이스를 확장 사용하여 구현하였기에 궁금하여 이에 대해 조사 후 포스팅하게되었다. JPARepository 위의 그림은 Spring Data JPA 진영에서 제공하는 인터페이스의 상속관계를 도식화한것으로 아래로 갈 수록 저수준 모듈이며 기능 구현이 많음을 알 수 있다. JPARepository의 최대 장점은 인터페이스에 별다른 정의 없이 다양한 메서드를 사용할 수 있다는 것이 장점이다. 하지만 이 또한 JPARepository의 최대 단점으로 다가온다. 이는 객체 지향의 관점과도 연관되는데 불필요한 메시지 노출된다는 점이다. 불필요한 메시지..
· Spring-boot
Spring Data JPA를 사용할 때 10,000건 혹은 100,000건의 대규모 데이터를 저장하려면 어떻게 해야할까? 단순 계산으로만도 생각을 해보았을 때, 엔티티 1 : insert 쿼리 1의 방식을 서버에 부담시킨다고 가정하면 그 부하는 상상하기 힘들것이다. 우리는 이러한 부분을 개선하기 위한 방법으로 jdbc에서 설정값으로 제공하는 batch_size를 사용하는 법도 있지만 JDBCTemplate를 이용하는 Case를 소개하고자한다. Bulk Insert 우선 벌크연산이란 무엇일까? 데이터베이스에서 하나의 쿼리로 여러 데이터를 처리하는 작업을 말한다. 보통 삽입,수정,삭제 작업에 사용된다. 기본적으로 3건의 삽입(insert) 쿼리를 처리한다고 가정하면 아래와 같은 쿼리를 떠올릴 것이다. 일반..
필자의 경우 Java에서 예외를 다루는법은 try/catch 이외에는 잘 알고있지 못했다. 하지만, 테스트코드에서 예외를 다루기위해 try/catch를 쓴다는 것은 정말이지 부적합 문법이라고 생각을 했고, 이를 역시 Junit측에서도 인지를 하였기에 별도의 예외처리를 위한 메서드를 구현해두었다. Junit에서 Assertions를 통한 예외를 다루는법 우선적으로 예외를 다루기 위해서 예외를 발생시키 메서드를 하나 생성하자. public class OnlyUseException(){ public static void error() { throw new RuntimeException("Something Error!"); } } 이를 실제 테스트코드에 적용시킨다면, 마냥 에러를 발생시키는 것이 아닌 테스트 조..
· Spring-boot
💡 해당 포스팅은 기본 개념과 땡칠님과 멍토님의 테코톡 영상을 바탕으로 포스팅 되는 글입니다. 기본적인 개념 + SSE에서 WebFlux를 사용할 때의 주의점을 다룹니다. 이번 포스팅에서는 늘 개발을 하며, 마주치는 용어인 동기와 비동기 그리고 블로킹과 논블로킹에 대해서 다룬다. 상위개념이 흔들릴수록 부가적인 개념도 약해지기에 확고하게 잡으려고한다. 그리고 추가적으로 이번 SSE를 쓰며, Spring 공식 스펙상에서 지원하는 타입이 SseEmitter와 WebFlux가 존재하였고 필자는 WebFlux를 적용하게 되어 그 이유를 앞선 개념들과 엮어 설명하려한다. 우선, 해당 개념들에 공통적으로 사용되는 용어가 있다. 바로 제어권과 결과값의 반환이다. 이 용어의 개념의 이해는 전체적인 연관성을 파악하기 필요..
· Spring-boot
What is Projection? Projection이란 DB에서 필요한 속성(Table의 원하는 컬럼)만을 조회하는 것을 의미한다. 이를 ORM인 JPA에서는 Spring Data JPA를 활용하여 Projection을 사용할 수 있고, 여러 방법이 존재한다. . Why? 필자는 서버 개발자로서 가장 중요시하는 부분이 "일관된 반응과 그에 따른 최적화" 이다. Projection을 사용한다면, 불필요한 컬럼의 조회를 지양함으로서, 최적화된 API를 설계할 수 있는 것이다. 예를 들어, 배달의 민족에서 우리의 예민한 개인정보를 기입할 일이 많다. 최상단에 회원 도메인이 존재할 때, 결제정보와 휴대폰 번호와 같은 민감도가 높은 정보부터 내가 찜을 누른 가게들의 정보와 같은 정보들이 있다고 가정해보자. 과..
· Spring-boot
소개배경 나는 원래 Service Layer에서 비즈니스 로직을 작성할 때, @Transactional(readOnly=true) 설정을 거의 의무적으로 해왔었다. 성능이 향상된다는 것은 알고 있었지만, 해당 원리는 파악하지 못하고 관습적으로 사용하는 것을 지양하고자 포스팅하게 되었다. Annotation @Transactional(readOnly=true) 우선 해당 속성값을 사용할 경우 아래와 같은 이점을 얻을 수 있다고 정의되어 있다. 💡 예상치 못한 엔티티의 등록(insert),변경(update),삭제(drop)을 예방할 수 있고, 또한 성능을 최적화 할 수 있다. 하지만, 우리는 아직 풀지 못한 숙제가 있다. "어떻게 성능이 최적화되는가?" 해당 동작원리에 대해 자세히 이해하기 위해선, 우선 J..
· Spring-boot
소개 배경 최근 주변 개발자가 SpringBoot를 처음시작하며, 강의 영상을 따라하는 것 같아 오랜만에 김영한님의 강의를 볼겸 레포지토리를 구경하다가 이상한 점을 포착하여 리뷰를 남기었는데 나 또한 정작 OSIV에 대해 제대로 알지못한다고 생각해 포스팅을 해보고자 한다. 문제점 내가 이상하다고 느꼈던 부분은 Entity에서 지연로딩 전략을 이용하고 있는데 OSIV 설정값을 false로 해놓을 경우 지연로딩에 한해서 LazyInitializationException이 발생하기에 지양한는 것으로 알고있었기 때문에 의문을 가지게 되었다. 엥 OSIV가 뭐지? Spring Boot에서 애플리케이션을 실행시킬 경우 아래와 같은 실행 로그를 본적이 있을 것이다. 2023-03-14 11:26:08.544 WARN..
· Spring-boot
소개 배경 최근 진행중인 프로젝트의 경우 OAuth와 JWT 환경에서 동작되고 있다. 그에 따라 yaml 파일의 가독성 저하와 profiles를 사용하고 있음에도 목적에 맞게 사용하지 않는다고 생각하여 포스팅하게 되었다. 우선 yaml에서 파일은 분리하기 위한 설정 요소들에 대한 설명과 사용하는 법에 대해 설명하고자한다. 엥 Profiles? Profiles은 Spring Framework의 고유한 설정 방식 중 하나로 나의 Application이 어떤 환경에서 동작할지를 설정하는 것이다. 여러 개의 환경에 대한 설정을 관리하기 위한 기능으로 구성하고자 하는 환경에 관한 설정파일을 생성한 후 해당 환경이 동작할 때 해당환경에 맞는 설정파일에서 요소들을 활성화시켜 애플리케이션을 구동한다. 예를들어 개발환경..
LEE티씨
'Spring-boot' 카테고리의 글 목록