Spring
-
[AWS + JENKINS + SONARQUBE] Spring 프로젝트 CI/CD 구현하기 1) CI 구현하기 (Jenkins 설치 및 실행, Github연동(ssh, webhook))Spring 2022. 9. 17. 09:14
CI/CD는 예전에 미션을 진행하면서 jenkins를 이용한 CI/CD 구현에 대해서 한번 찾아본 적이 있긴 하지만, 구체적으로 정리하면 좋을 것 같아 진행하게 되었다. ( 마침 면접용 spring 프로젝트가 생겼기 때문이기도 하다!😅 ) EC2에 자바 설치 가장 먼저 프로젝트를 배포할 ec2를 만들어 준다. 나의 경우 ubuntu 22.04 버전을 사용하고 퍼블릭 ip를 이용하여 접속이 가능하도록 설정해주었다. (ec2생성 파트는 지난 배포 블로그 글에서 자세히 다루었다) 먼저 ubuntu ec2에 접속하여 자바를 설치해준다. $ sudo apt update $ sudo apt install default-jre $ sudo apt install default-jdk ## 설치된 자바 버전 확인 $ j..
-
에러 페이지 반환하기 (Feat.ErrorController)Spring 2022. 8. 29. 16:25
과제제출형 면접을 진행하면서 예외처리는 모두 GlobalExceptionHandler(ControllerAdvice)에서 처리가 되도록 설정하였다. 그러나 웹상에서 잘못된 경로로 입력하여 들어갈 경우에는 가장 기본적인 예외인 whiteLabel 에러 페이지가 나타나고 이에 대해 왜 그런가 하는 질문을 받게 되었으나 답변을 제대로 하지 못하였다 😭. 이 질문의 의도는 ErrorController의 처리 방법에 대해서 묻는 질문으로 서블릿 컨테이너에서 등록된 서블릿에서 요청처리를 하다가 오류가 발생하였지만 해당 서블릿에서 처리하지 못하고 서블릿 컨테이너까지 오류가 전파되었을 때 서블릿 컨테이너가 오류(ServletException으로 래핑)를 처리하기 위해 특정 경로(server.error.path)로 해당..
-
@Aspect (AOP) 적용하기Spring 2022. 6. 9. 00:21
김영한 강사님의 스프링 고급편을 듣고, 이번 withEmployee 프로젝트 리팩토링을 진행하면서 프로젝트에 AOP를 구현하고 싶었기에 공부한 내용을 바탕으로 프로젝트에 클래스 깊이를 나타내면서 로그를 나타내는 부분을 AOP를 적용하기로 했다. AOP AOP 는 Aspect Oriented Programming(관점 지향 프로그래밍) 으로 핵심기능 관점과 부가적인 기능 관점을 나누어 보고 흩어진 부가기능 관심사를 모듈화 하여 핵심비지니스에서 분리하여 관리하는 것을 말하며 여러 오브젝트에 산재해서 나타나는 공통적인 기능인 횡단 관심사를 깔끔하게 처리하기 어려운 OOP의 부족한 점을 보완한다. 스프링에서의 AOP 스프링 AOP 는 런타임시에 프록시를 생성하는 프록시 패턴 기반의 AOP 구현체 로 스프링 빈에..
-
Springboot와 React(Axios)에서 컨트롤러 prefix 수정하기Spring 2022. 5. 30. 20:30
어느정도 리팩토링을 마치고 ec2로 배포하려고하니 계속해서 문제가 발생한다.😖 중간중간 계속해서 실행해보고 미션 공부하면서 프로젝트에 바로바로 적용하도록 수정했으면 이리 고생하지 않았을텐데 증말 〰️ 프론트엔드와 백엔드를 각각 ec2 서버를 생성하고 리버스 프록시를 생성하고 실행하려고하니 prefix로 분리해서 요청을 보내고 싶은데,,, 원래 개발할때부터 prefix를 정해놓고 했어야했는데,,, 실행하려고 보니 이 간단한 분리도 안되어있다. (머리짚🤦♀️) 그래서 한번에 적용하려고 방법을 찾게 되었다. Springboot server.servlet.contextPath=/api Springboot에서 api prefix를 적용하는 방법은 Controller에서 @RequestMapping을 이용하여 적..
-
PUT vs PATCHSpring 2022. 3. 21. 16:48
기존 자원에 대해 업데이트를 실행하는 API중 PUT과 PATCH의 차이를 알아보자. PUT PATCH 사용 기존 자원에 대한 정보를 업데이트 할 때 자원 일부의 업데이트 정보만 담은 요청을 받을 때 넘어오지 않은 정보에 대해 null로 처리 (대상 리소스를 나타내는 데이터를 대체, 전체 교체) 넘어온 정보에 대해서만 업데이트 진행 (부분 교체) URI의 자원이 존재하지 않을 때 새로운 자원을 생성하고 정보를 반영 자원이 존재하지 않아 오류 발생 멱등성 여부 (동일할 요청을 여러번 연속으로 보내도 같은 응답으로 반응) O (넘어온 자원이 존재하지 않으면 최초 한번만 생성 후 계속 같은 값을 응답) X (자원에 대한 수정이 반복적으로 진행된다.) 멱등성 PATCH에서 멱등성이 보장되지 않는 다는 것은 무엇..
-
Repository Layer의 단위테스트 작성Spring 2022. 3. 11. 17:19
비지니스 로직은 도메인 계층에서 발생하고, 엔티티의 영속화 요구는 서비스 계층에서 발생하기 때문에 Repository의 단독 테스트를 진행하기 위해서는 Service 계층과의 관계를 끊어야 한다. SpringBoot에서는 @DataJpaTest 어노테이션을 통해서 JPA컴포넌트와 관련된 Repository의 단위테스트가 가능하도록 해준다. @DataJpaTest DataJpaTest 어노테이션은 JPA와 관련된 설정만을 로드하여 @Entity 어노테이션이 붙은 클래스를 스캔하여 저장소를 구성한다. 트랜잭션을 기본적으로 내장하고 있어 테스트 코드가 종료되면 자동으로 롤백이 이루어진다. 테스트 코드 @RunWith(SpringRunner.class) @DataJpaTest @AutoConfigureTestD..
-
테스트 진행시 @Value (application.properties.yml) 값을 읽지 못할 때 (NullPointerException)Spring 2022. 3. 4. 23:22
서비스 계층 테스트를 진행하려고 하는데 @Value값을 사용하는 경우 테스트 진행시 값이 없어 null pointer exception 이 발생하게 되었다. ( 프로퍼티 값이 로드되지 않기 때문!) ( 추가로 테스트 진행시 Mockiito를 사용하지 않는다면 @TestPropertySource어노테이션을 이용해 테스트 프로퍼티 소스를 따로 분리할 수도 있다. ) 기존 코드 @Service public class ProductService { @Value("${AWS_S3_BUCKET_URL}") private String AWS_S3_BUCKET_URL; //... } 수정한 코드 @Service public class ProductService { private String bucketUrl; publ..
-
Service 계층에서 다른 Service 혹은 RepositorySpring 2022. 3. 4. 23:01
리팩토링을 진행하던 중 Service에서 Repsitory를 직접적으로 의존하여 데이터를 찾다보니 연관관계의 데이터를 findBy 객체 찾기가 반복되게 되었다. 한 곳에 findBy를 구현하고 이 함수를 다른 Service가 의존해야 한다는 피드백을 받게 되었다. 기존의 코드 @Service public class FollowService { private FollowRepository followRepository; private UserRepository userRepository; // 직접 의존 //... //연관관계에 존재할 때마다 반복되던 코드 private User findByUserId(Integer id) { return userRepository.findById(id) .orElseTh..