본문 바로가기

전체 글86

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.
sprigboot 프로젝트 진행중 리펙토링 적용 개발을 하는데 있어서 가장 중요하고 자주하는 것이 리펙토링이라 들었다. 지금 작성한 코드가 다른 사람이 볼때 충분히 가독성이 있을지, 객체지향적인 방식을 잘 활용하고 있는지를 확실치 못하고 있었다. 면접을 위한 cs전공지식노트(주홍철)에서 디자인 패턴 중 펙토리 패턴과 전략 패턴에 대해서 적용해보고자 리펙토링을 하게 되었다. 위 패턴들을 적용하려는 이유는 현재 진행중인 프로젝트 중 findArticles가 하나의 메서드로 되있지만 public, private, grouped에 따라 구분을 해야한다. 하나의 메서드로 3개를 경우에 따라 구분을 하는 것보다는 3개의 메서드로 가독성을 향상시키는 것이 좋다고 생각하였기 때문이다. 하지만 이 패턴들을 findArticleService에 막연히 적용하기에는 상당히.. 2023. 4. 1.
백엔드, 프론트 서버를 연결할 때: 'CORS' 문제 및 해결법 나는 백엔드를 spring 프레임워크로, 프론트를 react 프레임워크로 개발을 할 때 가장 처음 직면한 문제가 있었다. 그것은 바로 'CORS' 문제였다. 아마 대부분의 개발자들이 프론트 담당이든 백엔드 담당이든 개발을 하면서 무조건 적으로 직면하였을 문제이다. 이 글에서는 CORS에 대해 간단하게 설명하고 어떻게 해결하는지를 작성할 것이다. 이를 해결하는 법은 다양하게 있지만 내가 사용하는 방식만을 작성할 것이니 다른 방법이 궁금하다면 다른 글들을 참고해 보길 바란다. CORS 란 교차 출처 리소스 공유(Cross-Origin Resource Sharing)란 서버가 웹 브라우저에서 리소스를 로드할 때 다른 오리진을 통해 로드하지 못하게 하는 HTTP 헤더 기반 메커니즘이다. 프론트엔드 서버를 만들어.. 2023. 3. 20.
Postman API를 통한 API 문서 작성 백엔드 담당으로 팀 프로젝트를 담당하다보면 api를 만들고 프론트한테 api에 대한 것들을 설명해야 할 경우가 많다. 항상 노션이라던가 구두로 이건 어떻게 저건 어떻고 등 설명을 해왔는데 시간도 오래걸리고 프론트단이 한번에 이해못하는 경우가 많았다. 이를 어떻게 해야하나 고민하던 도중 'API문서'라는 것을 알게되었고 적용한 내용을 작성해보고자 한다. 어떤 api는 body안에 어떤 데이터를 제공해야하고 헤더는 어떻고 queryString과 pathVariable은 어떤지, 더욱이 response때 데이터나 헤더는 어떤지 API 유형은 어떤지 등 프론트 단에서는 모든 정보가 다 궁금할 것이다. 정보를 확실히 알아야 적용을 할 수 있으니까 말이다. 그렇기에 백엔드 단에서는 정보들을 문서화에서 제공을 해주는.. 2023. 3. 12.
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.