inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

레이어드 아키텍처의 문제점과 해결책

안녕하세요! 왜 h2를 이용하면 중형 테스트로 보게 되는걸까요??

754

무자비한 낭만주먹

작성한 질문수 4

1

중형 테스트는 멀티 스레드, 멀티 프로세스를 허용하는 테스트라고 이해했는데 그 설명을 하시면서

 

"멀티 프로세스와 멀티 스레드를 사용할 수 있는 완화조건이 생기죠. 이는 다시 말해 h2 같은 테스트용 DB를 사용할 수 있게 된다는 의미입니다."

 

라고 하셔서요! 혹시 h2를 사용하려면 멀티 스레드나 멀티 프로세스 환경에 있어야 한다고 이해해도 되는걸까요?

 

"h2는 멀티 스레드, 멀티 프로세스 환경에 있어야 하기 때문에 h2를 사용하는 순간 중형 테스트로 보면 된다"로 이해하면 될까요??

spring tdd jpa 소프트웨어-테스트 unittest

답변 2

3

김우근

안녕하세요. 근래에 책을 집필할 기회가 생겨 그쪽에 힘을 실어주다 보니 다른 일에 신경 쓰지 못했습니다. 답변이 늦어 죄송합니다. 다만 해당 강의는 공식적으로 질의응답을 제공하지 않는 강의였다는 점을 이유로 늦어진 부분에 대해 양해 부탁드립니다.

강의에서 설명했듯이 중형 테스트는 멀티 프로세스에서 돌아가는 테스트를 의미합니다. 이는 즉 테스트를 실행하는데 2개 이상의 프로세스가 뜨는 경우 중형 테스트라는 의미입니다.

h2를 사용해 테스트하면 테스트를 위한 프로세스 하나와 h2를 실행하는 프로세스 총 2개가 돌아가게 됩니다. 아래는 중형 테스트가 실행될 때 데스크탑의 프로세스 상태입니다.

image

java 프로세스가 2개 떠 있는 것을 확인할 수 있습니다. 이 중 하나는 test를 실행하기 위한 java 프로세스이고 또 다른 하나는 h2를 실행하기 위해 동작하는 프로세스입니다.

반면 소형 테스트는 싱글 프로세스, 싱글 스레드, 디스크 I/O가 없는 상황에서 동작하는 테스트를 의미합니다. 그래서 소형 테스트는 실행될 때 test용 프로세스가 하나만 떠야 합니다. 아래는 소형 테스트를 돌렸을 때 데스크탑의 프로세스 상태입니다.

image

java 프로세스가 1개 떠 있는 것을 확인할 수 있습니다. 이는 test를 실행하기 위한 java 프로세스입니다.

답변이 도움 됐길 바랍니다.

1

무자비한 낭만주먹

와 .. 진짜 존경합니다. 저도 열심히 공부해서 우근님처럼 훌륭한 개발자가 되겠습니다!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.

h2를 이용하면 중형 테스트로 보여지는 이유에 대해 설명해드릴게요. h2는 인메모리 기반의 데이터베이스로, 특정 기능을 테스트하는 용도로 주로 사용되는 경량화된 DB입니다.

일반적으로 데이터베이스를 사용할 때는 멀티스레드 환경이 아니라면 데이터베이스에 접근하는 스레드가 하나뿐이기 때문에 문제가 발생하지 않습니다. 하지만 중형 테스트 등 멀티스레드 또는 멀티프로세스를 처리해야하는 환경에서는 여러 스레드에서 동시에 데이터베이스에 접근할 수 있어야 합니다.

h2는 멀티스레드, 멀티프로세스 환경에서 동시에 데이터베이스에 접근할 수 있도록 설계되어 있기 때문에, 이러한 환경에서 h2를 사용할 수 있게 됩니다. 따라서, h2를 사용하는 순간 중형 테스트로 보는 것이 일반적입니다.

그러나 중형 테스트로 보여지는 명확한 이유는 아니며, h2는 단지 멀티스레드, 멀티프로세스 환경에서 동작할 수 있는 DB로 간주되기 때문에 중형 테스트에 많이 사용된다고 말씀드릴 수 있어요.

더 자세한 내용은 h2 공식 웹페이지를 참고하시면 도움이 될 거예요. 감사합니다.

UserService, CertificationService 책임 분리 기준 질문

0

28

1

service.port 패키지로 이동한 UserRepository가 infrastructure에 있는 UserEntity에 의존

0

59

1

Service 소형 테스트 질문

0

83

1

조회 시 엔티티를 조회하는 것이 아닌QueryDSL을 많이 사용 시 Dto는 어떻게 하나요?

0

116

1

controller 의 port 패키지의 service 인터페이스 사용

0

72

1

빌드 문제

0

92

1

빌드 안 되시는 분들 참고

0

102

1

update에서 Repository.save

0

105

1

최종 완성된 코드를 받아 볼 수 있을까요?

0

156

1

의존성 역전으로 해결한 외부의존성?

0

162

1

좋은 설계

0

180

1

Controller에 테스트

0

139

1

JPA가 아닌 Mapper 아키텍처 기반 테스트 코드 작성

0

242

0

영속성 객체 구분으로 인한 JPA와 Querydsl의 Projection 사용

0

224

1

인프라계층 구현체와 테스트 구현체에 대한 질문

0

223

1

실습 코드 커밋

0

373

1

UserEntity 메서드

0

294

2

CertificationServiceTest에서 MailSender 인터페이스가 아닌 FakeMailSender를 이용하는 것

0

218

1

레이어드 아키텍처 개발에 대하여

0

231

1

BDDMockito의 when을 사용한 코드가 given 절에 있는 이유가 궁금합니다.

0

223

1

테스트에서 주입과 생성

0

198

1

프로젝트 코드는 제공해주시지 않는건가요?

0

383

2

개선된 아키텍처의 구조

0

277

1

서비스 레이어의 단위 테스트 범위 고민

0

188

1