Github Actions, Jib와 캐싱을 통해 CI 최적화하기 CI/CD 파이프라인에서 도커 이미지 빌드는 종종 전체 배포 시간의 상당 부분을 차지합니다. 빠른 피드백을 원하는 개발자들에게 이러한 상황은 별로 달갑지않죠. 특히 규모가 큰 프로젝트나 잦은 배포가 필요한 환경에서는 이 비용을 최소화하고 싶을 겁니다. 이번 포스팅에서는 기존 CI/CD 파이프라인을 최적화하는 과정에서, 구글의 Jib를 적용하며 겪었던 고민과 문제 해결 과정을 공유하려고 합니다.도커 빌드의 문제점과 Jib 소개기존 워크플로우의 한계와 고민점기존에 사용하던 GitHub Actions 워크플로우는 다음과 같은 절차로 구성되어 있었습니다.Gradle로 Java 애플리케이션 빌드Docker를 사용해 이미지 빌드Docker Hub에 이미지 푸시원격 서버에 배포이 과정에서 다음과 같은 고민들이 있었습.. Mockito 사용 중 @Spy로 실제 객체 동작 활용하기 배경소프트웨어 개발에서 리팩토링은 필수지만, 리팩토링으로 인해 기존 테스트 코드가 깨지는 경우가 많습니다. 최근 프로젝트를 리팩토링하다 비슷한 문제를 마주쳐서, 이번 시간에는 그 내용을 공유해보려 합니다.저희 팀은 ScheduleService 클래스에서 유효성 검증 로직을 분리하여 별도의 ScheduleCreateUpdateValidator 클래스로 추출하는 리팩토링을 진행했습니다. 이 과정에서 기존 테스트 코드가 실패하게 되었고, 해결 과정에서 Mockito의 @Spy를 사용하며 편리함을 깨달았습니다. 리팩토링 전후 코드 비교리팩토링 전 (ScheduleService 클래스 내부에 유효성 검증 로직 포함):@Service@RequiredArgsConstructorpublic class ScheduleS.. SQL에서 재귀 쿼리(CTE) 사용법 및 NOT IN vs NOT EXISTS 비교 최근 프로그래머스 SQL 고득점 Kit에서 4~5레벨 위주로 몇 문제를 풀고있습니다.https://school.programmers.co.kr/learn/courses/30/lessons/301651오늘 푼 문제 중 하나가 재귀 CTE를 이용하는 쿼리여서 이 참에 정리해보려고 합니다.데이터베이스에서 계층 구조와 같은 복잡한 데이터를 다룰 때 재귀 쿼리를 사용하면 도움이 될 수 있습니다. 이번 글에서는 SQL의 재귀 쿼리 활용법과 동작 원리, 그리고 NOT IN과 NOT EXISTS를 성능 측면에서 비교해 보겠습니다. 재귀 쿼리란?재귀 쿼리는 자기 자신을 참조하는 쿼리로, SQL에서는 CTE(Common Table Expression)를 사용하여 작성할 수 있습니다. 주로 다음과 같은 상황에서 유용하게 사.. JPQL은 쉽게 깨질 수 있다. 패키지 구조를 변경하며 패키지 구조를 개선하는 리팩토링 과정에서 JPQL로 작성된 부분들에 문제가 발생했습니다.바로, JPQL 쿼리에서 DTO 클래스 경로 참조가 깨지는 현상인데, 뭐 문자열이니까 어찌보면 당연한 결과기도 합니다. 짧게 설명해보겠습니다. 문제 상황계층형 패키지 구조에서 도메인 중심 패키지 구조로 전환하면서 아래와 같은 JPQL 쿼리가 동작하지 않았습니다:@Query("SELECT new com.appcenter.timepiece.dto.project.ProjectThumbnailResponse(p, c.thumbnailUrl) " + "FROM Project p " + "INNER JOIN MemberProject mp ON mp.projectId = p.id " + "LE.. Spring Security를 포함한 테스트 작성하기 개요@WebMvcTest를 이용하면 웹 계층의 슬라이싱 테스트를 수행할 수 있습니다. 이는 웹 계층 요청과 관련된 필터, 인터셉터 등의 컨텍스트를 포함하여 테스트하게 된다는 의미입니다. 여기에는 당연히 Spring Security 필터 체인도 포함되는데, Spring Security 필터 체인이 DelegateFilterProxy로 동작한다는 것을 기억해야 합니다.Spring Security를 포함하여 WebMvcTest를 수행할 때는 몇 가지 주의해야 할 점들이 있습니다. 이 글에서는 디버깅 과정을 통해 이를 해결하는 방법을 알아보겠습니다.테스트 코드먼저 테스트할 클래스는 다음과 같습니다:@WebMvcTest(AuthController.class)public class AuthControllerTest.. WebMvcTest 도중 Jpa 메타모델과 관련한 오류를 마주한다면? 문제 상황: WebMvcTest에서 JPA 관련 오류 발생타임피스 프로젝트에 컨트롤러 테스트 코드를 추가하던 중 의외의 문제에 부딪혔습니다. @WebMvcTest를 사용했는데 JPA 메타모델과 JpaAuditing 관련 에러가 발생했습니다.@WebMvcTest는 웹 계층과 관련된 컨텍스트만 로드하는 것이 목적인데(필터, 컨버터, 인터셉터, 시큐리티 필터체인 등), 왜 JPA 관련 모듈 에러가 발생한 것일까요?원인 분석그 답은 Spring Boot 공식 문서에서 그 답을 찾을 수 있었습니다:If you use a test annotation to test a more specific slice of your application, you should avoid adding configuration sett.. FetchType.LAZY와 Proxy, 그리고 Spring의 Transaction 처리 오늘 할 것. 앱센터 활동으로 학기 중 약소하게나마 ToDo List 프로젝트를 진행하고 있다. 현재 JWT를 이용한 로그인 기능을 개발중인데 다른 바보같은 실수들도 많았지만 그 중에서도 알고도 틀린 에러를 소개하려고 한다. LazyInitializationException 그래. 어디서 많이 봐서 이젠 익숙하다 못해 지겨울 지경이다. 아직까지 직접 마주한 적은 없었는데 굳이굳이 틀리며 또 배우게 되는구나. 이번 글에선 LazyInitializationException이 발생한 이유와 javax.persistence의 enum 클래스, 그 중에도 FetchType.LAZY와 Proxy에 대해 알아본다. 현재 상황 우선 로그를 보자. org.hibernate.LazyInitializationExceptio.. 세션은 어디에 저장될까? (HttpSession, Cookie and Session) 쿠키와 더불어 Session은 웹에서 널리 사용된다. 주로 유저의 로그인 정보를 다른 페이지로 넘어가서도 유지하기 위해 사용한다. 쿠키와 세션을 비교하는게 그다지 옳바른 방법같지는 않아보이나, 매번 그렇게 설명한다. 사실 이번 포스팅엔 그게 중요한게 아니고 '쿠키는 클라이언트에, 세션은 서버에 데이터를 저장한다'가 핵심이다. 그래. 쿠키는 브라우저에 누구나가 확인할 수 있는 방법으로 저장된다. 반면에 세션 방식은 데이터를 서버에 저장하고 브라우저는 세션ID만 쿠키로 저장한다. 브라우저는 서버에 요청을 보낼 때 쿠키 정보를 함께 보내고, 서버는 쿠키에 담긴 세션 ID를 이용해 세션 정보를 조회한다. 근데, 그래서 세션은 서버 '어디에' 저장되는데? 서버 구성에 따라 달라지겠지만, 크게 두 가지 선택이 있다.. 클래스 분리 시, #include 문의 위치 C++ 공부를 하다 문득 궁금해졌다. 클래스 분리가 없는 자바와는 다르게, C++에서는 클래스를 .h 헤더파일과 .cpp 소스파일로 나누어 구현한다. 좀 더 정확하게 말하면 클래스를 정의부와 구현부로 나누어 작성하는 것이다. 보통 소스파일은 헤더파일을 include하여 메소드를 구현하게 되는데, 이 떄 궁금한게 생겼다. 외부 클래스나 라이브러리를 써야하는 상황이라면, 어느 곳에서 include하는게 맞을까? .cpp 파일에 쓰면 당연히 상관이 없고, .h 파일에 써도 어차피 헤더파이을 include 하기 때문에 정상적으로 작동한다. 앞서 몇 시간동안 공부를 하다보니 머리가 둔해져서 이렇다 할 결론이 안 나오더라. 결국 궁금해서 찾아보았다. 그렇게, 2009년에 나와 같은 질문이 올라온 것을 발견한다. 그.. 콜백 메소드(Callback Method)는 뭘까. A callback function is a function passed into another function as an argument, which is then invoked inside the outer function to complete some kind of routine or action. Callback function - MDN Web Docs Glossary: Definitions of Web-related terms | MDN A callback function is a function passed into another function as an argument, which is then invoked inside the outer function to complete some k.. Android Lifecycle Andorid System의 리소스 관리 전략 Android 시스템이 실행중일 때, 필요한 자원이 부족하게되면 실행중인 프로세스를 강제로 종료시킨다. 프로세스 종료는 프로세스 상태(status)에 따르며, 위 그림에서 forground process의 중요도가 가장 높고 empty processes 의 중요도가 가장 낮은 우선 순위를 갖는다. Empty process는 새롭게 실행된 app을 처리하기 위해 대기중인 프로세스로, 메모리를 차지하고 있는 상태를 말한다. Activity Stack 모든 Activity는 Activity Stack으로써 관리된다. Stack이란 이름에 맞게, 새로운 액티비티는 스택에 최상단에 추가되며 running activity가 된다. 스택의 최상단에서만 activity의 .. 캐리지 리턴(CR)과 라인피드(LF) 리눅스를 공부하다 read를 이용해 키 입력을 받던 중, 문득 캐리지 리턴(CR)과 라인피드(LF)에 대해 궁금해졌다. 컴퓨터구조에서 문자코드를 처음 봤을 때도, 궁금했던 부분이었는데 어찌저찌 넘어가게 돼서 이제와 정리해보려 한다. 엔터키를 구성하는 요소 캐리지 리턴과 라인피드는 두개가 하나의 엔터키를 구성한다. 캐리지 리턴은 13, 라인피드는 10. 각각 유니코드로 나타내는 번호로, 13과 10이 모두 입력돼야 비로소 우리가 아는 엔터가 작동되는 것이다. 이 둘은 개행문자로, 각각 \r과 \n으로 나타낼 수 있다. 캐리지 리턴과 라인피드의 의미 사실 이 둘의 개념은 구식 타자기에서 가져온 것이다. 옛날 타자기를 생각해보자. 한자 한자 써내려가고 종이의 끝에 도달하면, 팅! 요란한 소리와 함께 다시 종이.. 이전 1 2 다음