전체 글
-
단위 테스트는 개별 메서드나 함수의 기능을 검증하는 테스트로, 독립적이고 빠르게 실행된다. 다른 계층과의 결합 없이 독립적으로 실행되어야 하므로 만약 서비스 계층에서 레포지토리 주입받아야 한다면 이때 레포지토리 목 객체를 사용하여 테스트할 수 있다. 하지만 통합 테스트는 개별 모듈들이 결합되어 전체 시스템이 올바르게 동작하는지 검증하는 테스트로 실제 데이터베이스, 네트워크 등의 외부 시스템과의 통합을 테스트할 수 있다. DB 저장을 확인하기 위해 H2 DB를 연동해서 하는 테스트도 일종의 통합 테스트로 볼 수 있다. 슬라이스 테스트란?슬라이스는 특정 계층에 대한 테스트로, 예를 들어 conroller, service, repository가 있다. 이때 스프링의 특정 컴포넌트만 로드해서 테스트할 수 있으..
[매일메일] 단위 테스트 vs 통합 테스트단위 테스트는 개별 메서드나 함수의 기능을 검증하는 테스트로, 독립적이고 빠르게 실행된다. 다른 계층과의 결합 없이 독립적으로 실행되어야 하므로 만약 서비스 계층에서 레포지토리 주입받아야 한다면 이때 레포지토리 목 객체를 사용하여 테스트할 수 있다. 하지만 통합 테스트는 개별 모듈들이 결합되어 전체 시스템이 올바르게 동작하는지 검증하는 테스트로 실제 데이터베이스, 네트워크 등의 외부 시스템과의 통합을 테스트할 수 있다. DB 저장을 확인하기 위해 H2 DB를 연동해서 하는 테스트도 일종의 통합 테스트로 볼 수 있다. 슬라이스 테스트란?슬라이스는 특정 계층에 대한 테스트로, 예를 들어 conroller, service, repository가 있다. 이때 스프링의 특정 컴포넌트만 로드해서 테스트할 수 있으..
2025.01.27 -
@Data@ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000", message = "총합이 10,000원이 넘게 입력해주세요.")public class Item { private Long id; private String itemName; private Integer price; private Integer quantity;} 인프런에서 영한님의 spring mvc 2 강의를 보던 중 @ScriptAssert 사용 시 다음과 같은 오류가 발생했다.No JSR 223 script engine found for language "javascript". 원인은 바로 JDK 버전 때문이다. JD..
No JSR 223 script engine found for language "javascript".@Data@ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000", message = "총합이 10,000원이 넘게 입력해주세요.")public class Item { private Long id; private String itemName; private Integer price; private Integer quantity;} 인프런에서 영한님의 spring mvc 2 강의를 보던 중 @ScriptAssert 사용 시 다음과 같은 오류가 발생했다.No JSR 223 script engine found for language "javascript". 원인은 바로 JDK 버전 때문이다. JD..
2025.01.24 -
공유 락(Shared Lock, Read Lock)과 배타 락(Exclusive Lock, Write Lock)은 비관적 락의 데이터 일관성과 무결성을 위해 사용한다.공유 락 vs 배타 락 공유 락은 Read Lock으로도 불리며, 공유 락이 걸린 데이터는 읽기 연산(SELECT)만 가능하며 그 외에 쓰기 연산(UPDATE, DELETE)은 불가능하다. 이때 다른 트랜잭션에서도 공유락이 걸린 데이터에 대해 또 다른 공유 락은 획득할 수 있지만 배타 락은 획득할 수 없다. 즉 공유락을 사용함으로써 트랜잭션 내에서 조회한 데이터가 변경되지 않았음을 보장받을 수 있다. 배타 락은 Write Lock으로도 불린다. 즉 배타 락을 획득한 트랜잭션은 읽기 그리고 쓰기 연산이 모두 가능하다. 하지만 다른 트랜잭..
[매일메일] 공유 락 vs 배타 락공유 락(Shared Lock, Read Lock)과 배타 락(Exclusive Lock, Write Lock)은 비관적 락의 데이터 일관성과 무결성을 위해 사용한다.공유 락 vs 배타 락 공유 락은 Read Lock으로도 불리며, 공유 락이 걸린 데이터는 읽기 연산(SELECT)만 가능하며 그 외에 쓰기 연산(UPDATE, DELETE)은 불가능하다. 이때 다른 트랜잭션에서도 공유락이 걸린 데이터에 대해 또 다른 공유 락은 획득할 수 있지만 배타 락은 획득할 수 없다. 즉 공유락을 사용함으로써 트랜잭션 내에서 조회한 데이터가 변경되지 않았음을 보장받을 수 있다. 배타 락은 Write Lock으로도 불린다. 즉 배타 락을 획득한 트랜잭션은 읽기 그리고 쓰기 연산이 모두 가능하다. 하지만 다른 트랜잭..
2025.01.24 -
동기와 비동기동기(Synchronous)동기 방식은 일련의 실행 과정이 순차적으로 진행되는 것을 말한다. 즉 한 작업이 마무리되기 전까지 다른 작업이 기다려야 한다는 의미이다. 이러한 동기 방식은 호출한 함수 혹은 작업이 반환될 때까지 실행 흐름이 차단되는 특징이 있다.비동기(Asynchronous)비동기 방식은 작업들이 독립적으로 실행되는 것을 의미한다. 그래서 작업의 완료 여부에 상관없이 다른 작업을 실행할 수 있다. 비동기 방식은 I/O 처리나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 적용하는 방식으로, 콜백, 프로미스, async/await 등으로 구현 가능하다. 그럼 (논)블로킹과 (비)동기는 어떤 차이가 있을까?(논)블로킹과 (비)동기사실 블로킹과 동기는 기다리는 거고, 논블로킹과 비동..
[매일메일] 동기와 비동기의 차이?동기와 비동기동기(Synchronous)동기 방식은 일련의 실행 과정이 순차적으로 진행되는 것을 말한다. 즉 한 작업이 마무리되기 전까지 다른 작업이 기다려야 한다는 의미이다. 이러한 동기 방식은 호출한 함수 혹은 작업이 반환될 때까지 실행 흐름이 차단되는 특징이 있다.비동기(Asynchronous)비동기 방식은 작업들이 독립적으로 실행되는 것을 의미한다. 그래서 작업의 완료 여부에 상관없이 다른 작업을 실행할 수 있다. 비동기 방식은 I/O 처리나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 적용하는 방식으로, 콜백, 프로미스, async/await 등으로 구현 가능하다. 그럼 (논)블로킹과 (비)동기는 어떤 차이가 있을까?(논)블로킹과 (비)동기사실 블로킹과 동기는 기다리는 거고, 논블로킹과 비동..
2025.01.23 -
TCP 3-way handshake란 TCP에서 처음에 연결을 수립할 때 사용되는 절차로 클라이언트와 서버 간에 총 3번의 메시지(세그먼트)를 교환하는 과정을 포함한다.클라이언트가 서버에 연결을 요청하기 위해 SYN 플래그를 보낸다. 여기에는 Sequence Number가 포함되어 있다. 클라이언트가 SYN_SENT 상태로 변하고 서버는 LISTEN 상태에서 클라이언트가 보낸 SYN을 받는다. 이에 대한 응답으로 Sequence Number에 1을 더한 값으로 ACK 플래그를 전송하고 서버는 SYN_RECEIVED 상태로 변한다. 다시 클라이언트는 서버가 보낸 ACK과 SYN을 받게 되고 서버가 보낸 SYN 값에 1을 더한 값을 ACK에 담아 보냄으로써 클라이언트와 서버 간에 연결이 성립하게 된다. 연결..
[매일메일] TCP 3-way handshake란?TCP 3-way handshake란 TCP에서 처음에 연결을 수립할 때 사용되는 절차로 클라이언트와 서버 간에 총 3번의 메시지(세그먼트)를 교환하는 과정을 포함한다.클라이언트가 서버에 연결을 요청하기 위해 SYN 플래그를 보낸다. 여기에는 Sequence Number가 포함되어 있다. 클라이언트가 SYN_SENT 상태로 변하고 서버는 LISTEN 상태에서 클라이언트가 보낸 SYN을 받는다. 이에 대한 응답으로 Sequence Number에 1을 더한 값으로 ACK 플래그를 전송하고 서버는 SYN_RECEIVED 상태로 변한다. 다시 클라이언트는 서버가 보낸 ACK과 SYN을 받게 되고 서버가 보낸 SYN 값에 1을 더한 값을 ACK에 담아 보냄으로써 클라이언트와 서버 간에 연결이 성립하게 된다. 연결..
2025.01.22 -
동기와 비동기동기(Synchronous)동기 방식은 일련의 실행 과정이 순차적으로 진행되는 것을 말한다. 즉 한 작업이 마무리되기 전까지 다른 작업이 기다려야 한다는 의미이다. 이러한 동기 방식은 호출한 함수 혹은 작업이 반환될 때까지 실행 흐름이 차단되는 특징이 있다.비동기(Asynchronous)비동기 방식은 작업들이 독립적으로 실행되는 것을 의미한다. 그래서 작업의 완료 여부에 상관없이 다른 작업을 실행할 수 있다. 비동기 방식은 I/O 처리나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 적용하는 방식으로, 콜백, 프로미스, async/await 등으로 구현 가능하다. 그렇다면 동기 방식으로 외부 서비스를 호출 및 처리하는 서비스에서 외부 서비스 장애가 발생하면 어떻게 해결할 수 있을까? 우선 ..
[매일메일] 동기 방식으로 외부 서비스 호출 시 외부 서비스 장애가 발생하면 해결 방법?동기와 비동기동기(Synchronous)동기 방식은 일련의 실행 과정이 순차적으로 진행되는 것을 말한다. 즉 한 작업이 마무리되기 전까지 다른 작업이 기다려야 한다는 의미이다. 이러한 동기 방식은 호출한 함수 혹은 작업이 반환될 때까지 실행 흐름이 차단되는 특징이 있다.비동기(Asynchronous)비동기 방식은 작업들이 독립적으로 실행되는 것을 의미한다. 그래서 작업의 완료 여부에 상관없이 다른 작업을 실행할 수 있다. 비동기 방식은 I/O 처리나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 적용하는 방식으로, 콜백, 프로미스, async/await 등으로 구현 가능하다. 그렇다면 동기 방식으로 외부 서비스를 호출 및 처리하는 서비스에서 외부 서비스 장애가 발생하면 어떻게 해결할 수 있을까? 우선 ..
2025.01.21 -
@Component, @Controller, @Service, @Repository는 각 역할에 맞는 스프링빈을 등록할 때 사용하는 어노테이션으로 스프링의 컴포넌트 스캔에 의해 자동으로 빈으로 등록된다. @Controller, @Service, @Repository는 내부적으로 @Component를 포함한다. @Component가장 기본적인 어노테이션으로, 특정 역할에 종속되지 않는 일반적인 스프링 빈을 나타낸다. 공통 기능을 제공하는 유틸리티 클래스나, 특정 계층에 속하지 않는 일반적인 컴포넌트를 정의할 때 사용된다.@Controller스프링 MVC에서 웹 요청을 처리하는 컨트롤러 클래스에 사용된다. Dispatcher Servlet은 뭔데요?Dispatcher Servlet에 대해 알아보기 전에 아래..
[매일메일] @Component, @Controller, @Service, @Repository의 차이에 대해서 설명해주세요.@Component, @Controller, @Service, @Repository는 각 역할에 맞는 스프링빈을 등록할 때 사용하는 어노테이션으로 스프링의 컴포넌트 스캔에 의해 자동으로 빈으로 등록된다. @Controller, @Service, @Repository는 내부적으로 @Component를 포함한다. @Component가장 기본적인 어노테이션으로, 특정 역할에 종속되지 않는 일반적인 스프링 빈을 나타낸다. 공통 기능을 제공하는 유틸리티 클래스나, 특정 계층에 속하지 않는 일반적인 컴포넌트를 정의할 때 사용된다.@Controller스프링 MVC에서 웹 요청을 처리하는 컨트롤러 클래스에 사용된다. Dispatcher Servlet은 뭔데요?Dispatcher Servlet에 대해 알아보기 전에 아래..
2025.01.20 -
Dispatcher Servlet은 뭔데요?Dispatcher Servlet에 대해 알아보기 전에 아래 글에서 서블릿에 대해 알아보고 오자!⬇️ 서블릿이 뭐에요?스프링 MVC에 대해 공부하던 중 서블릿에 대한 나름대로의 정리가 필요할 것 같았다. 그래dockerel.tistory.com위에서 설명한 Dispatcher Servlet에서 요청을 처리하는 과정을 알아보았다. 근데 결론은 HTML을 랜더링 해서 보여주는 것이었는데, HTTP API처럼 JSON 데이터를 HTTP 메시지 body에서 직접 읽고 처리하려면 어떻게 해야 할까? 결론은 HTTP 메시지 컨버터를 사용하면 편리하게 데이터를 처리할 수 있다.위 그림에서 볼 수 있듯이 @ResponseBody 사용 시 문자는 StringConverter로 ..
HTTP 메시지 컨버터가 뭔데요?Dispatcher Servlet은 뭔데요?Dispatcher Servlet에 대해 알아보기 전에 아래 글에서 서블릿에 대해 알아보고 오자!⬇️ 서블릿이 뭐에요?스프링 MVC에 대해 공부하던 중 서블릿에 대한 나름대로의 정리가 필요할 것 같았다. 그래dockerel.tistory.com위에서 설명한 Dispatcher Servlet에서 요청을 처리하는 과정을 알아보았다. 근데 결론은 HTML을 랜더링 해서 보여주는 것이었는데, HTTP API처럼 JSON 데이터를 HTTP 메시지 body에서 직접 읽고 처리하려면 어떻게 해야 할까? 결론은 HTTP 메시지 컨버터를 사용하면 편리하게 데이터를 처리할 수 있다.위 그림에서 볼 수 있듯이 @ResponseBody 사용 시 문자는 StringConverter로 ..
2025.01.19