2022 01 26 - oneso123456789/2022 GitHub Wiki

Other

RedirectAttributes에서 자꾸 s를 누락함 s가 붙어야함
그리고 저번에 DTO를 공부할때 DTO의 다른이름이 VO라고 했지만 정확히는 다른것임
또한 위키말고 gitbook을 이용해볼지도 고민해봐야함

VO

  • 데이터 그 자체로 의미 있는 것을 담고 있는 객체이다.

  • DTO와 동일한 개념이나 차이점은 Read–Only 속성 객체이다.

  • 간단한 독립체( Entity )를 의미하는 작은 객체를 의미한다.

  • 관계데이터베이스의 레코드에 대응되는 자바클래스이다.

  • 형태는 Database레코드를 구성하는 필드들을 VO의 Attribute로 하고 해당 변수에 접근 할 수 있는 Getter와 Setter 메소드의 조합으로 클래스를 형성되어진 클래스이다.

  • 거의 불변성을 가지고 equals()로 비교할 때 객체의 모든 값을 비교해야 한다.

DTO

  • 전송되는 데이터의 컨테이너이다.

  • VO와 동일하게 데이터를 저장하여 사용하도록 하는 부분에서 필요하다.

  • VO와 비교를 하여 보면 DTO는 같은 시스템에서 사용되는 것이 아닌 다른 시스템으로 전달하는 작업을 처리하는 객체이다.

  • Layer간의 통신 용도로 오가는 객체를 말하기도 한다.

  • 현재의 개발 환경에서 보통 데이터는 다음과 같이 흐름으로 이동한다.

  • 서버 측 : Database Column Data -> DTO -> API(JSON or XML) -> Client

  • 클라이언트 측 : Server -> API(JSON or XML) -> DTO -> View or Local Database System

VO와 DTO 정리 :

  • VO : 사용 되는 값이 객체로 표현 되며, 값 변경이 없는 경우를 말한다.

  • DTO : 데이터의 전송을 위한 객체이며, 비지니스 로직까지 담아서 사용하기도 한다.

출처: https://ijbgo.tistory.com/9 [한량 개발자]

WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/] in DispatcherServlet with name 'appServlet'

오류가 야기됨 2022-01-26 23시12분
아마 servlet-conxtext.xml파일을 보던중 의도치 않게 오류가 생긴거 같음 해결방법은 servlet-context.xml파일에 스페이스바를 눌러서 공백문자를 넣어준후 다시 지운후 저장하니 해결함

Model이라는 데이터 전달자

RedirectAttribute

Model 타입과 더불어서 스프링 MVC가 자동으로 전달해 주는 타입 중에는 RedirectAttribute 타입이 존재함
RedirectAttribute는 조금 특별하게도 일회성으로 데이터를 전달하는 용도로 사용함
RedirectAttribute는 기존에 Servlet에서는 response.sendRedirect()를 사용할 때와 동일한 용도로 사용함

Servlet & Spring MVC에서 사용법

Servlet에서 redirect방식

    response.sendRedirect("/home?name=crow&age=26);

스프링 MVC를 이용하는 redirect처리

  rttr.addFlashAttribute("name", "crow");
    rttr.addFlashAttribute("age", 26);

    return "redirect:/";

RedirectAttribute는 Model과 같이 파라미터로 선언해서 사용하고, addFlashAttribute(이름,값) 메서드를 이용해서 화면에 한번만 사용하고
다음에는 사용되지 않는 데이터를 전달하기 위해서 사용함

Controller의 리턴 타입

스프링 MVC의 구조가 기존의 상속과 인터페이스에서 어노테이션을 사용하는 방식으로 변한 이후에 가장 큰 변화 중 하나는 리턴 타입이 자유로워진 부분임


Controller의 메서드가 사용할 수 있는 리턴 타입은 주로 다음과 같음

  • String: jsp를 이용하는 경우에는 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용함
  • void: 호출하는 URL과 동일한 이름의 jsp를 의미함
  • VO, DTO 타입:주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용함
  • ResponseEntity 타입: response 할때 Http 헤더 정보와 내용을 가공하는 용도로 사용함
  • Model, ModelAndView: Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용함(최근에는 많이 사용하지 않음 2018년도 기준임 2022년도엔 모름)
  • HttpHeaders: 응답에 내용 없이 Http 헤더 메시지만 전달하는 용도로 사용함

void 타입

메서드의 리턴 타입을 void로 지정하는 경우 일반적인 경우에는 해당 URL의 경로 그래도 jsp 파일의 이름으로 사용함

Controller에 ex05() 메서드 추가

딱히 설명할 부분없이 @GetMapping을 "/ex05"로 지정해주고 메서드를 만든후 log.info로 /ex05라는 로그를 남겨줌
그리고 해당 경로에 접속시 404에러가 표시됨 이유는 'WEB-INF/views/sample/ex05.jsp`경로에 ex05파일이 없기때문임
이것은 servlet-context.xml의 아래의 설정과 같이 맞물려 URL 경로를 View로 처리하기 때문에 생김

servlet-context.xml일부

  <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" /> (prefix는 접두사)
    <beans:property name="suffix" value=".jsp" />  (suffix는 접미사)
  </beans:bean>

String 타입

void 타입과 더불어서 가장 많이 사용하는 것으로 String 타입은
상황에 따라 다른 화면을 보여줄 필요가 있을경우 유용하게 사용
if~ else와 같은 처리가 필요한 상황
일반적으로 String 타입은 현재 프로젝트의 경우 JSP 파일의 이름을 의미함
또한 프로젝트 생성 시 기본으로 만들어진 HomeController의 코드를 보면 String을 반환 타입으로 사용함
String 타입에는 다음과 같은 특별한 키워드를 붙여서 사용할 수 있음

  • redirect: 리다이렉트 방식으로 처리하는 경우
  • forward: 포워드 방식으로 처리하는 경우

HomeController의 일부

  @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model){
      logger.info("Welcome home! the client locale is {}.", locale);

      Date date = new Date();
      DateFormat dateformat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

      String formattedDate = dateFormat.format(date);

      model.addattribute("serverTime", formattedDate );

      return "home";
}

home 메서드의 파라미터는 Locale와 Model로 그중 Locale는 지역의 언어,나라등을 담고있는 정보임
logger.info를 이용해서 로그에 환영한다는 메시지를 남기는대 이때 사용해서 나라를 표시해줌
INFO : com.crow.controller.HomeController - Welcome home! The client locale is ko_KR.

또한 날짜를 표시하기 위해서 Date와 DateFormat을 사용함 포맷은 getDateTimeInstance를 이용해서 날짜와 시간까지 가져와준다 또한 날짜를 롱 형태로 시간역시 롱 형태로 해주고 마지막으로 로컬을 한국으로 표시해준다
(날짜만 가져오려면 getDateInstance를 이용 시간만 가져올꺼면 getTimeInstance)

날짜표시 추가내용

DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale)
The time on the server is 2022년 1월 27일 목요일 오전 2시 06분 55초 KST.

DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
The time on the server is 2022년 1월 27일 (목) 오전 2시 07분 55초.

DateFormat.FULL과 DateFormat.LONG은 약간의 차이가 존재하지만 기본값인 LONG을 사용해도 별로 불편한점은 없어보인다

또한 이 포맷을 String형의 변수 formattedDate에 넣어줘서 model에 addAttribute로'serverTime'속성에 넣어준다.
그뒤 결과값으로 "home"을 리턴해준다
home() 메서드는 'home'이라는 문자열을 리턴했기 때문에 경로는 '/WEB-INF/views/home.jsp'경로가 됨
참고:https://promobile.tistory.com/197

객체 타입

Controller의 메서드 리턴 타입을 VO(Value Object)나 DTO(Data Transfer Objcet)타입 등
복합적인 데이터가 들어간 객체 타입으로 지정할 수 있는데, 이 경우는 주로 JSON 데이터를 만들어 내는 용도로 사용함
우선 이를 위해서 jackson-databind 라이브러리를 pom.xml에 추가함

개발자 도구를 통해서 살펴보면(개발자 도구 네트워크쪽) 서버에서 전송하는 MIME 타입이 Content-Type: application/json;charset=UTF-8으로 처리됨
만일 Jackson-databind 라이브러리가 포함되지 않았다면 500 internal Server Error를 보게됨
스프링 MVC는 리턴 타입에 맞게 데이터를 변환해 주는 역할을 지정할 수 있는데 기본적으로 JSON은 처리가 되므로 별도의 설정이 필요가 없음
스프링 3버전까지는 별도의 Converter를 작성해야 했음

pom.xml에 jackson-databind 라이브러리 추가

  <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.4</version>
  </dependency>

2.9.4 버전은 많은 보안문제가 있지만 일단 예제와 같은결과를 갖추는게 중요하므로 일단 사용하기로함

SampleController에 ex06()메서드 추가

    @GetMapping("/ex06")
    public @ResponseBody SampleDTO ex06() {
        log.info("ex06......");
        SampleDTO dto = new SampleDTO();
        dto.setAge(26);
        dto.setName("Crow");
        
        return dto;
        
    }

메서드의 리턴타입은 SampleDTO고 파라미터는 없음
SampleDTO앞에 @ResponseBody 어노테이션을 선언해 줘야지만 JSON형태로 프로젝트 경로/ex06에 JSON형태로 결과를 보여줌
누락시 그냥 어김없이 404 에러표시가뜸
URL로 호출시 로그를 기록하고 SampleDTO를 import해서 set메서드로 age와 name에 값을 넣어줌

⚠️ **GitHub.com Fallback** ⚠️