본문 바로가기

springboot26

Java Springboot AOP를 통한 로그 출력 및 파일화(메서드 이름을 활용) 이 글에서는 Springboot 프로젝트를 진행하면서 AOP를 통해 로그 출력을 하는 과정을 담았다. AOP에 대한 개념적인 부분은 별도의 참고 URL로 표기하였고 활용 위주로 작성하였다. 글을 작성하기 전 간단하게 AOP를 통해 로그 처리를 한 소감을 말하자면 정말 말도 안 되게 유용한 기능이라고 생각한다. 처음에는 그냥 메서드마다 로직 사이에 log.info를 추가하기만 하면 되는 것을 뭐 하러 코드까지 늘리면서 다른 AOP 클래스를 생성할까? 하고 의구심이 들었다. 하지만 구현해놓고 수정할 일이 있어 메서드를 수정할 때 log출력에 관한 부분은 하나도 신경을 쓰지 않고 메인 로직을 수정할 수 있었다. 이게 AOP를 사용하는 진정한 장점이라는 것을 깨달았다. 다음 프로젝트에서도 계속 AOP를 통해 로.. 2023. 7. 8.
springboot delete시 DB접근, 쿼리 횟수에 대한 고찰(mybatis, jpa) 이 글은 프로젝트를 진행하면서 delete를 진행 시 mybatis 및 jpa를 사용하였을 때 DB에 접근하는 횟수 및 쿼리 횟수에 대해 비교하여 주관적으로 작성한 글이다. Article 테이블이 DB에 저장되어 있다고 하자. 여기서 Ariticle 하나를 delete 하려고 한다. jpa는 영속성 컨테스트라는 1차 캐시를 가지고 있다. 그렇기에 트랜젝션 안에서 select를 통해 Article 테이블 정보를 객체로 가져오면은 이에 해당하는 정보가 영속성 컨테스트에 저장된다. 그리고 delete를 실행하면 쿼리를 따로 저장해 놓았다가 트랜젝션 종료 시 저장해 놓은 쿼리를 DB에서 전달하여 실행하게 된다. 즉, article를 select하기 위해 DB접근 1회, 쿼리 실행 1회, 트랜젝션이 종료되면 쿼리.. 2023. 6. 24.
네트워크 성능 분석 명령어 이 글은 네트워크의 기초 내용을 '면접을 위한 CS전공지식노트(주홍철)'과 '쉽게 배우는 데이터 통신과 네트워크(박기현)'을 읽고 공부한 내용을 간단하게 정리한 글이다. 애플리케이션 코드 상에는 문제가 없지만 서버로부터 데이터가 늦게 들어오거나 아예 들어오지 않는 경우가 있는데 이는 네트워크 병목 현상일 가능성이 있다. 병목(bottleneck) 현상은 전체 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한을 받는 현상을 말한다. 병의 몸통보다 병의 목 부분 내부 지름이 좁아서 물이 천천히 쏟아지는 것에 비유하여 bottleneck라는 이름이 붙었다. 서비스에서 이벤트를 열었을 때 트래픽이 많이 생기고 그 트래픽을 잘 관리하지 못하면 병목 현상이 생겨 사용자는 웹 사이트로 들어가지 못한다. 이때는 .. 2023. 6. 4.
springboot with mybatis - foreign key로 연결된 행 삭제 이 글은 JPA로만 프로젝트를 진행하다가 mybatis를 사용할 때 발생하는 문제중 고아객체에 관한 내용을 담고 있다. 저번 프로젝트에서 스프링부트와 JPA로 진행을 하였는데 delete 쿼리를 날릴 때 고려한 것은 고아객체였다. 외래키로 연관관계에 있는 두 엔티티 부모를 삭제하면 부모의 외래키를 가지고 있는 자식은 어떻게 되는가? 에 대한 내용이 고아객체 내용이다. JPA에서는 부모객체가 삭제되어 없는 상황일 때 자식객체를 고아객체로 표현하였고 이를 객체 내의 어노테이션을 달아서 해결했었다. 그렇다면 Mybayis에서 어떻게 해결할까? 처음에는 고아객체가 데이터베이스 전체에서 쓰이는 말인줄 알았지만 알고보니 JPA에서만 사용되는 말이었다. 그렇기에 Mybatis 고아객체라고 검색을 해도 인터넷에는 나오.. 2023. 4. 9.
springboot with mybatis - test 설정(인메모리 db: h2) springboot로 mybatis를 이용하여 실제 데이터를 기반으로test를 진행하고 있었다. 하지만 실제데이터로 진행하면 그때그때마다 상황이 달라지기 때문에 테스트 코드가 무조건 성공할 수는 없다. 그렇기에 테스트가 실행될 동안만 필요한 DB를 구현해야 했다. 바로 인메모리 DB를 말이다. 현 상황은 springboot로 mybatis를 사용중이고 flyway를 통해 DB마이그레이션을 하고 있다. Repository 테스트 코드를 작성하기 위해 인메모리 DB인 h2를 사용하려고 한다. 테스트 코드 내의 resources는 아래와 같다. application.yml의 내용은 아래와 같다. spring: datasource: driverClassName: org.h2.Driver password: pas.. 2023. 4. 5.
Springboot - 서비스 단위 테스트 스프링 프로젝트를 진행하면서 service 클래스의 테스트를 진행해야 한다. 전에는 인 메모리 db를 활용하여 service 내의 repository를 실제 호출하면서 테스트를 진행하였다. 하지만 여기에는 문제가 있는데 repository를 사용하고 DB로 부터 영향을 받는 것이다. service 테스트를 진행하는 것은 순전히 service 내의 기능만을 잘 돌아가는 지를 확인하는 것이다. 하지만 예전 방식은 service 내의 repository 기능 또한 테스트를 진행하는 것이다. 통합테스트를 하는 것처럼 보일 것이다. 이러한 문제를 해결하는 것이 Mockito를 사용하는 것이다. Mockito는 단위 테스트를 위한 java mocking framework이다. Mockito에 대해 알기 전에 먼저 .. 2023. 4. 2.
sprintboot with mybatis - 캐시 및 readonly 적용 평소에 JPA를 통해서만 프로젝트를 진행하였지만 mybatis도 다루고 싶엇기에 스프링부트와 mybatis를 통한 프로젝트를 진행하였고 repository구간을 작성하던 중에 문득 생각이 들었다. mybatis에서는 쿼리힌트로 readOnly옵션을 적용할 수 있는가? JPA를 사용할 때에는 쿼리힌트로 readOnly옵션을 줘가지고 메모리 성능향상을 이루었다. 이에 대해 궁금한 사항은 아래를 참고하길 바란다. https://khdscor.tistory.com/20 JPA 읽기전용으로 데이터를 조회하여 성능 향상(메모리, 속도) JPA를 사용하면서 영속성 컨텍스트에 엔티티를 넣으면서 1차 캐시 및 쓰기 지연 등 여러 가지 이점을 얻을 수 있었다. 여기서 조회기능만을 사용하는 상황에서는 단순히 읽기 전용 기능.. 2023. 3. 5.
AWS RDS를 통한 관계형 데이터베이스 구축 및 springboot 연동 들어가기 프로젝트를 진행함에 있어서 가장 중요한 것 중 하나는 데이터베이스이다. 간단히 로컬에서 프로젝트를 진행할 때는 h2를 사용하였고 배포까지 진행할 때는 배포서버 내부에 mariaDB를 설치하여 데이터를 삽입하였다. 그렇다면 aws 프리티어를 사용하고 있을 때는 어떻게할까? 프리티어로 진행한 서버는 내부 용량이 적기 때문에 데이터베이스 크기도 작을 수 밖에 없고 한눈에 데이터들을 파악하기도 힘들다. 그리고 배포 서버에 문제가 생기면 데이터베이스에 접근할 수 없다는 문제도 있다. 이럴때 유용한 것이 aws rds이다. aws rds는 aws에서 rds 전용 서버를 제공을 해주는 서비스이다. 즉, 배포서버에서 데이터를 rds 서버로 저장을 시켜서 데이터를 굳이 배포서버에 저장할 필요가 없어진다. 배포서.. 2023. 2. 22.
Jenkins를 활용한 React, Springboot CI,CD 구현(2) 들어가기 이 글은 Jenkins를 활용하여 React, Sprongboot를 배포하는 CI, CD를 구현하는 과정을 작성한 글이며, CD에 중점을 두어 작성하였다. 이전 내용은 아래의 주소를 참고하길 바란다. https://khdscor.tistory.com/67 aws jenkins(docker)를 활용한 react, springboot CI,CD 구현(1) 팀 프로젝트를 진행하다가 개발회사에 다니시는 분께서 개발 회사에서는 본격적으로 개발하기 전에 테스트 서버라는 것을 만들어서 디자이너, 기획 등 다같이 프로젝트 현황을 볼 수 있도록 한 khdscor.tistory.com Jenkins를 통한 CD 1. Jenkins 설정 이전 글까지 자동 빌드를 구현하였다. 이제 남은 것은 자동 배포이다. reac.. 2023. 1. 21.