Spring Web MVC (1) 개요

강서진·2024년 2월 7일

4번째 필수 강의 part 3. ch 1 요약

실시간 시설 이용 현황 알리미 프로젝트

입장 인원이 통제되는 상황에서 이용 현황을 공유하는 서비스

  • 관리자: 시설 이용 현황이 전산화되지 않은 곳이 많고, 입장 인원을 통제하지만 이용 현황을 공유하는 책임을 가지고 있지 x
    --> 서비스 동기 낮음
  • 사용자: 시설에 직접 방문하거나 시설에 연락하지 않는 한 입장 정원을 알 수 없음
    --> 사용 동기 높음

서비스가 도움이 되기 위해서는 관리자와 사용자 모두에게 사용 동기가 필요

  • 서비스 목표: 온라인으로 실시간 이용 현황 체크
  • 사업자의 사용동기: 낮음(의무x)
  • 사용자의 사용동기: 충분(신뢰할 수 있다면)
  • 사용성:
    - 사업자: 무조건 편리해야
    • 이용자: 기존 방식(직접 방문 or 연락)보다 편하고 신뢰할 수 있어야 함

필요한 기능

  • 관리자:
    - pc와 모바일 둘 다 접근 가능해야 함 --> 반응형 웹
    • 관리자 식별 가능 --> 로그인 인증 기능
    • 시설 관리 기능 --> 시설 위치, 담당자, 연락처 정보 등
    • 이용 정보 --> 이용 가능 시간, 입장 정원 등
    • 실시간 --> 원클릭으로 가능한 쉽게 작동
  • 사용자:
    - 개인 식별 필요 x
    • 시설 조회 기능
    • 실시간 이용 현황 정보

도메인

  • 관리자와 시설이 반드시 1:N이거나 N:1로 매칭되지 않고, 한 관리자가 여러 시설을 관리하거나 한 시설이 여러 관리자를 가질 수도 있기 때문에 admin과 place 사이에 브리치 테이블(혹은 맵핑 테이블)을 두어 어느 관리자가 어느 시설을 관리하는지에 대한 맵핑 정보를 담아 다대다 관계를 만들어준다.
  • 또, 한 시설은 여러 개의 이벤트를 가질 수 있고, 또 아무 이벤트를 가지지 않을 수도 있다. 이를 고려하여 시설과 이벤트 간 0:N의 관계를 설정해준다.

API

뷰는 URL 링크를 타고 들어가 보이는 실제 페이지들을 말하며,
로그인 요청, 시설 조회 및 시설 등록 등의 데이터가 오가는 일들을 위주로 API를 작성할 것이다. 이 때 이러한 설계들은 REST 규약을 따른다.
구현해야 하는 API 엔드포인트는 다음과 같다.


애너테이션 기반 설계 (@Controller와 @RestController)

@RestController = @ResponseBody + @Controller

  • Spring Initializr를 사용하여 빌드하였다. 시작할 때 추가한 의존성은 Lombok, Spring Web이다.

API 명세서를 참고하여 컨트롤러를 작성한다. 도메인이 그렇게 많지 않아서 한 컨트롤러 안에 다 작성할 수 있다고 하지만, 편리성을 위해 나눠서 작성하기로 한다.
@Controller는 뷰를 렌더링하여 반환해준다. BaseController 클래스를 만들어 @Controller를 붙이고 작성한다.

  @GetMapping("/")
  public String root(){
    return "index";
  }

index.html을 만들고 resources 밑의 static이나 templates에 넣어주어도 찾지 못하는 것을 볼 수 있다. 이는 톰캣이 자동으로 webapp 디렉토리의 .jsp 파일을 찾아가도록 되어있기 때문이다. 그러나 main, test와 같은 선상에 webapp 폴더를 만든 후 index를 넣어주고, project structure에서 경로를 추가해주어도 .jsp 파일을 찾기 때문에 잡지 못한다. properties 문서에 suffix 설정으로 추가해두면 연결이 된다.

// application.properties 
spring.mvc.view.suffix=.html

그러나 번거롭기도 하고, 요새는 jsp 파일을 잘 사용하지 않기 때문에 대신 AutoConfiguration이 되는 템플릿 엔진을 더 많이 사용한다.

하여 Thymeleaf 의존성도 함께 추가해준다. 이 템플릿 엔진을 추가해주면 자동으로 webapp이 아닌 resources로 맵핑되어 편리해진다.

다음으로 error 페이지도 따로 띄울 수 있도록, 기본으로 나오는 whitelabel 에러 페이지 설정을 false로 준 후 맵핑해준다. 이렇게 하더라도 Spring Boot가 기본적으로 error 페이지를 생성하는 과정이 완전히 제거되지 않으므로 이 컨트롤러가 ErrorController 인터페이스를 구현하도록 명시해줄 필요가 있다.

// application.properties 
server.error.whitelabel.enabled=false
---
@Controller
public class BaseController implements ErrorController {
...
  @RequestMapping("/error")
  public String error(){
    return "error";
  }

다음으로는 Controller 패키지 안에 API 패키지를 생성하여 @RestController를 붙이고, @RequestMapping으로 /api가 앞에 오도록 하여 api 명세서에 적힌 url들을 전부 맵핑해 어노테이션 기반 설계를 마친다.

0개의 댓글