단위 테스트 vs 통합테스트


[ 단위 테스트 ]

단위 테스트는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다.

여기서 모듈은 애플리케이션에서 작동하는 하나의 기능 또는 메소드이다.
ex) 서비스의 다양한 기능 중 로그인 메소드에 대한 독립적인 테스트가 1개의 단위테스트이다.

 

[ 통합 테스트 ]

통합 테스트는 모듈을 통합하는 과정에서 모듈간의 호환성을 확인하기 위해 수행되는 테스트이다.
애플리케이션은 여러개의 모듈로 이루어져있고, 서로 호출하면서 수행된다.그렇기 때문에 모듈들이 올바르게 연결되어 동작하는지 검증이 필요한데, 이를 위해서 통합테스트가 수행된다.

 

 

단위 테스트에 대해


[ 단위 테스트의 필요성 ]

일반적으로 실무에서 테스트 코드를 작성한다고 하면 거의 단위 테스트를 의미한다. 통합 테스트는 실제 여러 컴포넌트들 간의 상호작용을 테스트하기 때문에 모든 컴포넌트들이 구동된 상태에서 테스트를 하게 된다. 그렇기에 통합 테스트를 위해서는 캐시나 데이터베이스 등 다른 컴포넌트들과 실제 연결을 해야 하고, 시스템을 구성하는 컴포넌트들이 많아질수록 테스트를 위한 비용(시간)이 상당히 커진다. 반면에 단위 테스트는 해당 부분만 독립적으로 테스트하기 때문에 어떤 코드를 리팩토링하여도 빠르게 문제 여부를 확인할 수 있다.

 

좋은 테스트의 특징

  • 1개의 테스트 함수에 대해 assert를 최소화하라
    ->  assert : 단정 메소드로 테스트 케이스의 수행 결과를 판별합니다.
  • 1개의 테스트 함수는 1가지 개념만을 테스트하라

 

[ 단위 테스트의 문제점과 Stub ]

어떤 객체가 자체적으로 모든 일을 처리한다면 문제가 없겠지만, 일반적인 애플리케이션에서는 1개의 기능을 처리하기 위해 다른 객체들과 메세지를 주고 받아야 한다. 하지만 앞서 설명하였듯 단위 테스트는 해당 모듈에 대한 독립적인 테스트이기 때문에 다른 객체와 메세지를 주고 받는 경우에 문제가 발생한다. 그렇기 때문에 다른 객체 대신에 가짜 객체(Mock Object)를 주입하여 어떤 결과를 반환하라고 정해진 답변을 준비시켜야 하는데, 이를 stub이라고 한다.

ex)  회원가입 서비스를 테스트할 때, 이메일 중복 확인 서비스에 가짜 서비스를 주입하여 항상 False를 반환하도록 하는 것이 Stub

 

 

[ 참고 자료 ]

https://mangkyu.tistory.com/145

'JAVA > Spring' 카테고리의 다른 글

@Annotation 정리  (0) 2022.03.14
JSP View Resolver 설정  (0) 2022.03.14
@Controller : 요청에 따른 Method 형식과 응답  (0) 2022.03.14
Spring 뷰 폴더 위치  (0) 2022.03.14
HTTP Content-Type  (0) 2022.03.10

@RestController

@RestController

public String method()

{

        return "view-name"
}

  • 단순 @Controller면 View Resolver를 통해 "view-name"이라는 이름을 가진 뷰가 호출되어야 하지만, @RestController에 의해 "view-name" 문자열 그자체가 HTTP Message Body 안에 담겨 출력된다.

@PathVariable

@GetMapping("/mapping/{userId}")

public String method(@PathVariable("userId") String data)

{

        return "ok"
}

  • /mapping/jake로 요청하면, @PathVariable 어노테이션에 의해 data = jake와 같이 매핑된다.
  • /mapping/{userId}(파라미터명)과 String data(변수명)이 같으면 ("userId") 생략 가능

@RequestParam

@GetMapping("/mapping")

public String method(@RequestParam("userId") int userId, @RequestParam("userName") String userName)

{

        return "ok"
}

  • 쿼리 파라미터나 Form 요청을 받을 때 사용하는 어노테이션 -> @ModelAttribute를 통해 객체 형태로 간단히 가능

 

@ModelAttribute

@GetMapping("/mapping")

public String method(@ModelAttribute Member member)

{

        sout(Member.getUserId());

        sout(Member.getUserName());

        return "ok"
}

 

 

 

'JAVA > Spring' 카테고리의 다른 글

JUnit 테스트 정리  (0) 2022.03.21
JSP View Resolver 설정  (0) 2022.03.14
@Controller : 요청에 따른 Method 형식과 응답  (0) 2022.03.14
Spring 뷰 폴더 위치  (0) 2022.03.14
HTTP Content-Type  (0) 2022.03.10

application.properties 에 다음 코드 추가

spring.mvc.view.prefix = /WEB-INF/views/

spring.mvc.view.suffix = .jsp

 

'JAVA > Spring' 카테고리의 다른 글

JUnit 테스트 정리  (0) 2022.03.21
@Annotation 정리  (0) 2022.03.14
@Controller : 요청에 따른 Method 형식과 응답  (0) 2022.03.14
Spring 뷰 폴더 위치  (0) 2022.03.14
HTTP Content-Type  (0) 2022.03.10

요청 : GET 요청

@Controller

public ModelAndView method()

{

        return new ModelAndView("view-name");
}

 

@Controller
public String method() 

{

        return "view-name";
}


요청 : 쿼리 파라미터 GET 요청, <form> POST 요청

@Controller

public ModelAndView method(HttpServletRequest request, HttpServletResponse response)

{

        int age = Integer.parseInt(request.getParameter("age"));

        Member member = new Member(age);

 

        ModelAndView mv = new ModelAndView("view-name");

        mv.addObject("member", member);
        return "view-name";
}

 

@Controller

public String method(@RequestParam("age") int age, Model model

{

        Member member = new Member(age);

        model.addAttribute("member", member);
        return "view-name";
}

 

@Controller

public String method(@ModelAttribute Member member, Model model)

{

        model.addAttribute("member", member);
        return "view-name";
}

 

@Controller

public String method(@ModelAttribute("member") Member member, Model model)

{

        model.addAttribute("member", member);
        return "view-name";
}

 

@Controller

public String method(@ModelAttribute("member") Member member, Model model)

{

        model.addAttribute("member", member);
        return "view-name";
}


요청 : HTTP Message Body에 단순 텍스트 POST 요청 

※ 쿼리 파라미터 GET 요청, <form> POST 요청과 다르게 HTTP Message Body 요청은 @RequestParam, @ModelAttribute 사용 불가

 

@Controller

public void method(HttpServletRequest request, HttpServletResponse response)

{

        ServletInputStream inputStream = request.getInputStream();

        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF-8);
        response.getWriter().write("ok");
}

 

@Controller

public void method(InputStream inputStream, Wirter responseWriter)

{

        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF-8);
        responseWriter.write("ok");
}

 

@Controller

public HttpEntity<String> method(HttpEntity<String> httpEntity)

{

        String messageBody = httpEntity.getBody();
        return new HttpEntity<>("ok");

}

 

@Controller

public HttpEntity<String> method(HttpEntity<String> httpEntity)

{

        String messageBody = httpEntity.getBody();
        return new ResponseEntity<>("ok", HttpStatus.OK);

}

 

@Controller

@ReponseBody

public String method(@RequestBody String messageBody)

{       

        return "ok";
}


요청 : HTTP Message Body에 JSON POST 요청

@Controller

public void method(HttpServletRequest request, HttpServletResponse response)

{

        ServletInputStream inputStream = request.getInputStream();

        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF-8);

 

        Member member = objectMapper.readValue(messageBody, Member.class());
        response.getWriter().write("ok");
}

 

@Controller

@ResponseBody

public void method(@RequestBody String messageBody)

{

        Member member = objectMapper.readValue(messageBody, Member.class());
        return "ok";
}

 

@Controller

@ResponseBody

public String method(HttpEntity<Member> member)

{

        Member member = httpEntity.getBody();
        return "ok";
}

 

@Controller

@ResponseBody

public void method(@RequestBody Member member)

{       

        return "ok";
}

 

@Controller

@ResponseStatus(HttpStatus.OK)

@ResponseBody

public Member method(@RequestBody Member member)

{       

        return member;
}

 

@RequestBody 요청

  • JSON 요청 -> HTTP 메세지 컨버터 -> 객체

@RequestBody 요청

  • 객체 -> HTTP 메세지 컨버터 -> JSON 응답

 

 

'JAVA > Spring' 카테고리의 다른 글

JUnit 테스트 정리  (0) 2022.03.21
@Annotation 정리  (0) 2022.03.14
JSP View Resolver 설정  (0) 2022.03.14
Spring 뷰 폴더 위치  (0) 2022.03.14
HTTP Content-Type  (0) 2022.03.10

JSP

1) src/main/web/app/WEB-INF/jsp

2) src/main/web/app/WEB-INF/views

 

Thymeleaf & Velocity

-> src/main/resource/templates

 

CSS, JS, IMG

-> src/main/resource/static

'JAVA > Spring' 카테고리의 다른 글

JUnit 테스트 정리  (0) 2022.03.21
@Annotation 정리  (0) 2022.03.14
JSP View Resolver 설정  (0) 2022.03.14
@Controller : 요청에 따른 Method 형식과 응답  (0) 2022.03.14
HTTP Content-Type  (0) 2022.03.10

1. <form> tag 

Method : Only POST

Content-Type : application/x-www-form-urlencoded

HTTP Message Body를 사용하지만 형식은 Query Parameter로 전달, ex) username=hello&age=20

※ form 데이터도 메세지 바디를 통해 읽을 수 있지만, request.getParameter를 통해 읽는 것이 편리하고 주로 사용

 

2. Message Body

Method : POST, PUT, PATCH

JSON, XML, Text(Raw) 형식

※ GET은 URL Query Parameter 형식으로, HTTP Message Body를 사용하지 않아서 Content-Type이 없다.

1) Text

메세지 바디의 바이트코드 획득 : request.getInputStream()

바이트코드 -> String 변환 : SteramUtils.copyToString(UTF-8)

2) JSON 

Content-Type : application/json

메세지 바디의 바이트코드 획득 : request.getInputStream()

바이트코드 -> String 변환 : SteramUtils.copyToString(UTF-8)

(String) JSON -> 객체 변환 : Jackson 라이브러리(ObjectMapper) 사용, obejectMapper.readValue(객체.class)

※ JSON도 결국 String 형식임

'JAVA > Spring' 카테고리의 다른 글

JUnit 테스트 정리  (0) 2022.03.21
@Annotation 정리  (0) 2022.03.14
JSP View Resolver 설정  (0) 2022.03.14
@Controller : 요청에 따른 Method 형식과 응답  (0) 2022.03.14
Spring 뷰 폴더 위치  (0) 2022.03.14

파일 전송 시 인코딩 타입(enctype) -> multipart/form-data

 

location -> 일반적으로 잘 사용 X, 자바가 지정한 임시 디렉토리 사용

fileSizeThreshold -> 일정 크기가 넘어가면 서버 메모리가 아닌 location 디스크에 저장

maxFileSize -> 하나의 파일 사이즈 조절

maxRequestSize -> 전체 파일 사이즈 조절

 

파일을 상대경로에 저장하고 싶을 때 사용

'JAVA > Servlet & JSP' 카테고리의 다른 글

[Servlet & JSP] 서블릿 필터  (0) 2021.03.24
[Servlet & JSP] JSTL  (0) 2021.03.23
[Servlet & JSP] EL  (0) 2021.03.16
[Servlet & JSP] JSP MVC 모델  (0) 2021.03.15
[Servlet & JSP] JSP의 내장 객체  (0) 2021.03.15

'JAVA > Servlet & JSP' 카테고리의 다른 글

[Servlet & JSP] 파일전송  (0) 2021.04.09
[Servlet & JSP] JSTL  (0) 2021.03.23
[Servlet & JSP] EL  (0) 2021.03.16
[Servlet & JSP] JSP MVC 모델  (0) 2021.03.15
[Servlet & JSP] JSP의 내장 객체  (0) 2021.03.15

+ Recent posts