최근 한 프로젝트에서 HTTP 요청/응답을 로깅을 구현하게 되어 해당 글을 쓰게 되었습니다! ✔️ 프로젝트에 로깅을 도입하게 된 계기 운영서버에서 개발자가 발견하지 못한 엣지케이스 같은게 있을 수도 있는데, 이러한 경우에 대한 대비가 전혀되고 있지 않았던 상황이라는 생각이 들었어요. 따라서 로깅 시스템을 구축하여, 실제 운영상황 및 QA시에 버그가 발생했을때, 추적을 용이하게 하기 위해서 도입을 결정하게 되었습니다! 이전에 다른 프로젝트 했을때도, 사실 로깅을 신경을 많이 쓰지 못했기에 에러가 나는 상황에서 불편함이 종종 있었어요. 예를 들어, 클라에서 에러난다고 하면 원인을 찾고 빠르게 대응하기가 어려웠다거나... 그래서 지금처럼 실제 운영되고 있는 서비스에서는 더더욱 있으면 좋겠다 싶었습니다!..
예를 들어, 사용자에게 게시글 목록을 조회한다고 했을 때 한 화면에 10개씩 데이터를 보여주려고 한다.그런데 이때 클라이언트가 서버에게 DB에 존재하는 모든 게시글을 받아온다면 어떻게 될까? 성능이 매우매우 떨어질 것이다. 게시글 개수가 수백만,, 더 나아가 여러 사용자가 동시에 게시글 목록을 조회한다면DB에 많은 부하가 걸릴 것이다.. 이렇게 부하와 데이터 로딩 속도를 효율적으로 조절해주기 위해 등장한 것이 페이지네이션! 🪽 페이징(Paginatinon)데이터를 쪼개서 일부만 가져오는 기법 크게 offset 기반 페이징과, cursor 기반 페이징이 있다. 🪽 offset 페이징offset : 어디부터 시작해서 가져올것인지?limit : 몇개의 데이터를 가져올 것인지?SELECT *FROM pro..
해당 글은 지난 글에 이어서 작성하는 글이며, 김영한님의 '스프링 DB 1편 - 데이터 접근 핵심 원리' 강의를 참고했습니다. 멀티스레드 환경에서의 트랜잭션 동작 - feat. 테스트 코드최근에 한 프로젝트에서 테스트 코드를 짜다가 트러블 슈팅 과정에서 새롭게 안 사실이 있어서 블로그를 작성하게 되었다. "동일한 이메일로 사용자가 동시에 가입할 경우, 하나의 계정만 생성judyalwayswantscarrot.tistory.com 지난번 글에서 "멀티스레드 환경에서의 트랜잭션 동작"을 살펴보았다! 아래와 같이 테스트 코드를 짰을때, 메인 스레드인 테스트가 시작되는 메서드와 내부에서 생성된 3개의 스레드들에서 트랜잭션이 제대로 동작하고 있는지 확인보았다. 결과적으로는 메인 스레드인 테스트 메서드에서는..
최근에 한 프로젝트에서 테스트 코드를 짜다가 트러블 슈팅 과정에서 새롭게 안 사실이 있어서 블로그를 작성하게 되었다. "동일한 이메일로 사용자가 동시에 가입할 경우, 하나의 계정만 생성되는지"에 대한 테스트 코드를 짰다. 이를 위해 멀티스레드 환경에서 동시에 같은 이메일로 유저를 저장했을 때, 하나의 계정만 생성되었는지 확인하고자 했다. 처음 구성한 코드는 아래와 같다.1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950@DataJpaTestclass MemberRepositoryTest { @Autowired private MemberRepository memberRepositor..
최근 프로젝트에서 nginx 무중단 배포 설정을 하면서 겪은 일인데, 기록을 해두면 좋을 것 같아서 오랜만에 블로그를 쓰게 되었다.ㅎㅎ 우선 해당 프로젝트에서 github actions + aws code depoly + aws s3 + aws ec2를 사용하여 CI/CD 구축을 해놓은 상황이었다.무중단 배포 설정은 해두지 않아서, 새 버전으로 배포를 할 시에 다운타임이 생긴다는 치명적인 문제점이 있었다..! 이를 해결할 수 있는 방법으로, 리버스 프록시 역할을 해줄 수 있는 nginx로 무중단 배포를 하고자 하였다. TO-BE- 하나의 EC2 혹은 리눅스 서버에 Nginx 1대와 스프링부트 jar를 2대를 사용- 스프링부트1은 8081포트로, 스프링부트2는 8082포트(포트 번호는 자유)를 사용 Fl..
*인프런 '김영한'님의 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 강의를 듣고 정리한 내용입니다. 회원 도메인 개발 회원 서비스 개발@Transactional(readOnly = true) 조회(읽기)용일 때 사용하면 성능에 좋다.@RequiredArgsConstructor private final MemberRepository memberRepository**;** 생성자 주입 방법(아래와 같이 많이 사용) 🌟 @Transactional jpa의 모든 데이터 변경이나 로직은 가급적 트랜잭션 안에서 실행되야 함. 회원 테스트db에 쿼리 나가는 걸 보고 싶다면, @Rollback(false)한다.test > resources > application.yml 이유가? 좀 더 찾아봐야겠다 끝..
*인프런 '김영한'님의 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 강의를 듣고 정리한 내용입니다. 1.프로젝트 설정 프로젝트 생성 *3.0.5버전은 java 17에서 지원, java11 지원 안 함. 라이브러리 살펴보기 hikariCP 커넥션 풀 → 찾아보기 라이브러리 추가(from. 강의자료) Validation (JSR-303 validation with Hibernate validator) 모듈을 꼭! 추가해주세요. build.gradle에 다음 코드 추가 implementation 'org.springframework.boot:spring-boot-starter-validation' JUnit4 추가 (안 하면 JUnit5로 동작) testImplementation("org.ju..
스터디 2회차 ✅ 범위 : 쿼리 메소드 기능 - 스프링 데이터 JPA 페이징과 정렬까지 단축키 → shift + F6: 한 꺼번에 이름 바꾸기 1. 쿼리 메소드 기능 메소드 이름으로 쿼리 생성 1.1 범위 지정 쿼리 메소드를 사용해 조건에 맞는 데이터를 쉽게 조회할 수 있다. 쿼리 메소드에서 제공하는 키워드를 사용해 정확한 범위를 지정할 수 있다. 1.2 쿼리 메소드 필터 조건(Distinct, And, Or 등..) Spring Data JPA - Reference Documentation 1.3예시 public interface MemberRepository extends JpaRepository { List findByEmailAndName(String email, String name); List..