[Spring] 테스트 / JUnit / Mockito / 스프링의 계층별 단위테스트(Controller, Service, Repository)
·
Spring
이번에 컨트롤러 테스트 코드를 작성해보면서 정리한 것들! 1. 테스트테스트 : 프로그램을 실행했을 때 요구사항에 맞춰 동작하는지 검증하는 행위범위에 따른 분류단위 테스트 (Unit Test)통합 테스트 (Integration Test)E2E 테스트 (End-to-End Test) 1.1. 단위 테스트하나의 클래스와 메서드 단위로 비즈니스 로직 검증외부 의존성 없이, 하나의 기능/메서드가 정상 동작하는지 확인TDD에서의 테스트케이스는 주로 단위 테스트 작성을 의미자동화되어 사용 (CI; Continuous Integration)Java에서는 주로 JUnit5를 사용하여 작성모듈이 의존성을 가지는 경우, 의존 모듈을 Mock이라는 가짜 객체로 만들어 행동 및 결과값이 나오도록 정의한 후 테스트 가능@Te..
[Spring] 스프링의 기본적인 예외처리 / 예외처리 방법
·
Spring
1. Spring의 기본적인 예외 처리 방식Spring은 기본적으로 에러 처리를 위한 BasicErrorController가 구현되어 있다별도의 설정 없다면, /error로 에러 요청 다시 전달하도록 WAS 설정되어 있다.BasicErrorController로 에러 처리 요청을 전달WAS(tomcat) -> 필터 -> 서블릿(디스패처 서블릿) -> 인터셉터 -> 컨트롤러-> 컨트롤러(예외발생)-> 인터셉터 -> 서블릿(디스패처 서블릿) -> 필터 -> WAS(tomcat)-> WAS(tomcat) -> 필터 -> 서블릿(디스패처 서블릿) -> 인터셉터 -> 컨트롤러(BaicErrorController) 1.1. BasicErrorController@RequestMapping("${server.error...
[Spring] 스프링의 디렉토리 구조 : 계층형 / 도메인형
·
Spring
1. 스프링 디렉토리 구조스프링 디렉토리 구조를 설계하는 방식은 크게 계층형 / 도메인형 2가지가 있다 1.1. 계층형src/main/java/com/example/project/├── controller├── service├── repository├── dto├── entityMVC를 기반으로 각 계층을 대표하는 directory구조가 직관적이라 이해가 쉬움모든 도메인이 같은 디렉토리에 섞여 있음하나의 디렉토리에 많은 class 파일이 모여 모듈 단위 분리가 어려움 1.2. 도메인형src/main/java/com/example/project/├── DemoApplication.java├── domain│ │ ├── coupon│ │ │ ├── controller│ │ │ ├..
[Spring] Thread와 Java / Spring에서의 Multi-Thread 구현
·
Spring
0. 동기 / 비동기 & 블로킹 / 논블록킹동기 / 비동기 : 요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 수행할지 아닌지 관점블로킹 / 논블록킹 : 현재 작업이 block(차단, 대기) 되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지 관점 0.1. 동기(Synchronous) vs 비동기(Asynchronous)요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 수행할지 아닌지전체적인 작업에 대한 순차적인 흐름 유무동기 : 요청한 작업에 대해 완료 여부를 따져 순차대로 처리하는 것요청한 작업에 대해 순서가 지켜진다비동기 : 요청한 작업에 대해 완료 여부를 따지지 않기 때문에 자신의 다음 작업을 그대로 수행요청한 작업에 대해 순서가 지켜지지 않을 수 있다느린 작업(like I..
[Spring] 빌드 관리 도구 Maven vs Gradle
·
Spring
재직 중에 Maven만 사용하다가 요즘은 Gradle이 더 간결하고 많이 쓰인다길래 써보면서 차이점을 기록하려고 합니다 1. 빌드 관리 도구 (Build Tool)Maven과 Gradle은 모두 빌드 관리 도구작업종속성 다운로드소스코드를 바이너리 코드로 컴파일바이너리 코드를 패키징테스트 실행프로덕션 시스템에 배포 2. Maven vs Gradle 차이 2.1. Maven vs Gradle 차이 GradleMaven스크립트적은 양의 스크립트로 짧고 간결한 작성 가능프로젝트가 커질수록 길고 가독성 떨어짐동적 빌드동적 빌드는 Groovy 스크립트로 플러그인 호출하거나 직접 코드 작성 가능정적 형태의 XML 기반이라 동적 빌드 적용 어려움멀티 프로젝트설정 주입 방식 사용 → 멀티 프로젝트에 적합멀티 프로..
[Spring] JSP와 Spring에서의 Forward와 Redirect : InternalResourceView / RedirectView
·
Spring
JSP에서 한 서블릿에서 다른 서블릿 / JSP로 요청를 전달할 때 사용하는 방법인 Forward & Redirect에 대해 알아보고, Spring에서 이들을 어떻게 처리하는지 알아보자! 1. Forward "내가 물어보고 알려줄게" - 웹 애플리케이션에서 한 서블릿에서 다른 리소스(Servlet, JSP, HTML)로 요청을 전달 (총 요청 1번) - 클라이언트로 요청을 전달하는 것이 아니라 서버 내 다른 리소스 호출 - 기존 request 정보가 유지되어 조회 가능 1.1. Forward 예시 코드 @Controller public class TestController { @GetMapping("/test") public String test(HttpServletRequest request) { ..
[Spring] URL 매핑 : URL 패턴 Servlet URL Mapping / DispatcherServlet
·
Spring
1. URL 패턴 - URL 패턴 규칙을 생각하고 매핑 설정을 해야, 예상한 Servlet / Controller으로 요청할 수 있다 - Servlet과 Spring 모두 아래 URL 패턴 규칙을 사용 가능하다 (1. 2. ... : 우선순위) 종류 URL pattern 매칭 URL 1. exact mapping /test/hello.do http://localhost/syun/test/hello.do 2. path mapping /test/* http://localhost/syun/test/ http://localhost/syun/test/hello http://localhost/syun/test/hello.do http://localhost/syun/test/cat 3. extension mappin..
[Spring] MVC 패턴이란? Model / View / Controller / 메인 메서드 반환타입
·
Spring
0. 관심사의 분리 - OOP 5대 설계원칙 : SOLID • SRP : 단일 책임의 원칙 (하나의 메서드는 하나의 책임(Concern)) - 좋은 객체지향 설계를 위한 분리 1. 관심사 분리 2. 변하는 것(Common) / 변하지 않는 것(Uncommon) 분리 3. 공통코드 (중복코드) 1. MVC 패턴이란? - 소프트웨어를 Model - View - Controller의 3가지 구성 요소로 구분한 개발 방법론이다 - 사용자가 Controller를 조작 → Controller는 Model을 통해 데이터를 가져옴 → 데이터를 바탕으로 View를 통해 시각적 표현을 제어하여 사용자에게 전달 - Model : 정보 및 데이터 부분. 데이터와 관련한 값과 기능을 가지는 객체 - View : 입력값, 체크박..
[Spring] HttpServletRequest, HttpServletResponse 객체
·
Spring
HttpServletRequest - HTTP 프로토콜의 요청 정보를 서블릿에 전달하기 위해 사용 - 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어들이는 메서드 포함 - Body의 Stream 읽는 메서드 포함 - 예제 코드 Enumeration enum = request.getParameterNames();// 파라미터 이름들 (iterator) Map paramMap = request.getParameterMap(); // 파라미터 값들 map 형태로 (key-value) String[] yearArr = request.getParameterValues("year"); // name이 "year"인 value 모두 String year = request.getParameter("yea..
[Spring] 웹 개발을 하는 세 가지 방법(3) : API
·
Spring
웹 개발의 세 가지 방법 1. 정적 컨텐츠 2. MVC와 템플릿 엔진 3. API 👈 정적 콘텐츠가 아니라면 HTML로 내리냐 API 방식으로 데이터를 바로 내리느냐 두 가지만 생각하면 된다!! API > 간단한 String API 구현해보기 1. HelloController에 코드 추가 @GetMapping("hello-string") @ResponseBody public String helloString(@RequestParam("name") String name) { return "hello " + name; //"hello spring" } @ResponseBody : HTML의 응답 Body에 직접 데이터를 넣어주겠다 뷰 없이 문자가 그대로 내려간다 2. 실행 localhost:8080/hell..