상세 컨텐츠

본문 제목

[TIL#15-1] 가을에 시작한 Spring part.2 <테스트 코드, Spring MVC, Controller, 정적페이지&동적페이지>

내배캠/Chapter3

by DK9 2023. 11. 3. 20:03

본문

1. 테스트코드

  • 방법 1 - 블랙박스 테스팅 - 소프트웨어 내부 구조나 동작원리를 모르는 상태에서, 서비스의 사용자 입장에서 동작을 검사하는 방법.
    • 장점
      • 누구나 테스트가 가능
    • 단점
      • 기능이 증가될수록 테스트의 범위가 증가.
      • 시간이 갈수록 테스트하는 사람이 계속 늘어나야 함
      • 테스트하는 사람에 따라 테스트 퀄리티가 다름. = QA 직군이 있는 이유.
  • 방법 2 - 개발자 테스트 - 개발자가 직접 "본인이 작성한 코드"를 검증하기 위해 "테스트 코드"를 작성.
    • 장점
      • 빠르고 정확한 테스트가 가능. (예상 동작 VS 실제 동작)
      • 테스트 자동화 가능.
      • 리팩토링이나 기능 추가를 할 때 편리.
    • 단점
      • 개발 시간이 오래 걸림.
      • 테스트 코드를 유지보수비용 큼.
  • Spring에서 테스트 코드를 작성할 수 있는 환경을 제공해 준다.(=JUnit)
    JUnit은 테스트 실행 환경을 따로 가지고 있다. 그래서 Main메서드 없이 실행가능.
    테스트 코드 만드는 법 : 코드 작성한 곳 클릭 >> CTRL+SHIFT + T /or/ AfLT + INS >> Test... 클릭

 

  • Assertions : 테스트 코드 내에서의 동작을 검사하는 클래스, Assertions.assertEquals(예상값, 예상값과 비교할 변수)
  • Lombok -- 자바 프로젝트를 진행하는데 필요한 메서드/생성자 등을 자동 생성해 줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리

 

  • plugins에서 사용하게 설정하고, 설정창에서 Annotation Processors에서 Enable~~~를 체크한 후 어플라이한다.
    후에 메서드나 생성자를 만들고 싶은 클래스에 가서 클래스 위에 @=어노테이션 하면 된다.

 

  • application.properties -- Spring과 관련된 설정을 할 때 사용되는 파일.

 

  • ex)- Apache Tomcat을 사용하여 서버를 실행하면 기본 port 설정이 8080으로 되어있다.
     application.properties 파일에서 `server.port=8081`이렇게 입력하면 서버의 port 번호를 ‘8080’에서 ‘8081’로 바꿔서 실행시킬 수 있다.

 

2. Spring MVC란?

  • MVC란 Model-View-Controller의 약자로, 소프트웨어 디자인 패턴 중 하나.
  • MVC 패턴은 소프트웨어를 구성하는 요소들을 다음과 같이 역할을 분리한다.
    • Model - 데이터와 비즈니스 로직을 담당.
      • 데이터베이스와 연동하여 데이터를 저장하고 불러오는 등의 작업을 수행.
    • View - 사용자 인터페이스를 담당.
      • 사용자가 보는 화면과 버튼, 폼 등을 디자인하고 구현.
    • Controller - Model과 View 사이의 상호작용을 조정하고 제어.
      • 사용자의 입력을 받아 Model에 전달하고, Model의 결과를 바탕으로 View를 업데이트한다.

 

3. Controller 이해하기

  • 컨트롤러 역할을 할 클래스 위에 @Controller 어노테이션을 하고 밑에 받아올 주소(=@GetMapping("/hello") 와 같은 형태)를 작성한다. 이때 주소경로가 중복되어도 메서드는 달라야 한다.
  • 외부에서 해당 주소를 입력하면 리턴되는 정보(=데이터, 뷰, 파일 whatever....)을 가져간다.
  • 중복된 주소경로가 있다면 컨트롤러 클래스 위에 @RequestMapping("/주소") 를 입력해서 공통의 경로를 표시해 주고 해당 클래스의 모든 메서드들에 입력한 공통의 주소를 제외하고 입력한다.

 

    • RestController는 Responsebody + controller 이다. Responsebody는 return 할 것이 view 가 아닌 data라는 것을 의미한다. Responsebody에는 data만?가? 들어간다.
    • 현 수준에서는 이렇게만 이해하자.

 

 

  • RestController를 사용하지 않은 클래스. 각 메서드에 ResponseBody 어노테이션이 붙어있다.
  • 두 메서드 모두 Json형태로 조회할 수 있지만 실제론 Json이 아니고 상단 메서드는 text타입, 하단 메서드는 application타입이라는 차이가 있다.

 

4. 정적페이지 & 동적페이지

 

  • 우선 리턴할 파일들을 내부에서 찾아오는 것은 설정하기에 따라 다 다르다.
  • thymeleaf 는 동적 페이지 처리를 위한 템플릿 엔진이다. 추가하면 자동으로 Controller에서 html 파일 찾는 경로를 /resources/templates 으로 설정된다.

  • 정적 페이지를 처리하는 방법들.
  • 사실 정적 페이지는 < http://localhost:8080/hello.html > 꺽쇠 안의 방식으로 SpringBoot 서버에 html 파일을 바로 요청하면 해당 html 파일을 static 폴더에서 찾아서 반환해 준다.

 

  • 하지만 굳이 Controller를 통해서 반환하려면 첫 번째 메서드처럼 해주면 된다. 주석처리는 25번 줄을 주석처리.

  • 템플릿 엔진을 적용한 상태(=thymeleaf 주석 해제) 에서 static 폴더의 html 파일을 Controller를 통해서 처리하고 싶다면 이렇게 "redirect:/hello.html" redirect 요청을 문자열로 반환하면 http://localhost:8080/hello.html 요청이 재수행되면서 static 폴더의 파일을 반환한다.
  • 이 방법은 페이지에 변화가 있을 때, return 부분만 수정해 주면 된다.

 

  • static 폴더에 있는 html 파일을 바로 호출하는 방법이 가장 간단하다.
  • 하지만 브라우저에서 바로 접근하지 못하게 하고 싶거나 특정 상황에 Controller를 통해서 제어하고 싶다면 이렇게 templates 폴더에 해당 정적 html 파일을 추가하고 해당 html 파일명인 "hello" 문자열을 반환하여 처리할 수 있다. (.html은 생략가능!)

 

  • 위의 메서드들과 같은 클래스에 작성했다. 동적 페이지다.
  • long타입의 visitCount 는 동적 페이지에 필요한 데이터이다.
  • 동적 페이지 처리 과정
    1. Client 의 요청을 Controller에서 Model 로 처리.
      1. DB 조회가 필요하다면 DB 작업 후 처리한 데이터를 Model에 저장.
    2. Template engine(Thymeleaf) 에게 View, Model 전달.
      1. View: 동적 HTML 파일
      2. Model: View 에 적용할 정보들
    3. Template engine
      1. ViewModel을 적용 → 동적 웹페이지 생성
        1. 예) 로그인 성공 시, "로그인된 사용자의 Nickname"을 페이지에 추가
        2. Template engine 종류: 타임리프(Thymeleaf), Groovy, FreeMarker, Jade, JSP 등
    4. Client(브라우저)에게 View(동적 웹 페이지, HTML)를 전달.

관련글 더보기