spring boot MVC 패턴 연습하기

2024. 3. 11. 17:49카테고리 없음

 

 

 

package com.knu.demo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class MVCController {

    @GetMapping("/")
    public String hello(){
        return "home";
    }
    @GetMapping("/get")
    public String getStart(){
        return "getInput";
    }

    @GetMapping("/post")
    public String postStart(){
        return "postInput";
    }
    @GetMapping("/post2")
    public String APIpostStart(){
        return "APIPostInput";
    }

    @GetMapping("/info")
    public String getResult(
            @RequestParam("name") String name,
            @RequestParam("id") String id,
            @RequestParam("department") String department,
            Model model){

        model.addAttribute("name",name);
        model.addAttribute("id",id);
        model.addAttribute("department",department);

        return "getResult";
    }
    @PostMapping("/info")
    public String postResult(
            PostForm postForm,
            Model model){
        model.addAttribute("name",postForm.getName());
        model.addAttribute("id",postForm.getId());
        model.addAttribute("department",postForm.getDepartment());
        return "postResult";
    }


}

 

View에 thymeleaf 템플릿 엔진을 이용한다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>start</title>

</head>
<body>
<div th:text = "'이름 : ' + ${name}"> </div>
<div th:text = "'학번 : ' + ${id}"> </div>
<div th:text = "'학과 : ' + ${department}"> </div>
</body>
</html>

 

위의 코드는 PostResult.html이다. (View)

Controller는 view에 model을 전달한다.

thymleaf는 model에 있는 내용들을 view에 전달하여 view를 완성하고 완성한 view를 반환한다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>start</title>

</head>
<body>
<form action="/info" method="post">
    이름 : <input type="text" name="name"><br>
    학번 : <input type="text" name="id"><br>
    학과 : <input type="text" name="department"><br>
    <input type="submit">
</form>
</body>
</html>

위의 코드는 /info로 요청을 보내는 postinput.html이다

 

post요청을 보낼때 request body에 name=""&id=""&department="" 형식으로 서버에 post 요청한다.

그러면 스프링부트는 PostForm 형식으로 객체를 완성한다.

객체를 만들때 NoArgsConstructor로 객체를 생성하고 Setter를 통해 객체에 내용을 넣는다. (역 직렬화)

따라서 Setter와 NoArgsConstructor가 정의되어야한다.

만약 post요청을 json 형식으로 보내도 @RequestBody를 통해 이러한 객체 매핑을 가능하도록 만들 수 있다.

 

의문점 : Setter의 경우 객체가 변조될 가능성이 있는데 항상 Setter와 NoArgsConstructor를 써야하는 것인가??

1. DTO , VO, Entity를 따로 두어 해결할 수 있다.

DTO를 통해 객체 매핑을 시키고 VO나 Entity로 다른 생성 패턴과 도메인 로직을 구현하여 문제를 해결할 수 있다.

또한 DTO와 spring validation을 이용하여 DTO에 오는 값을 검증할 수 있다.

 

2. Jackson2HttpMessageConverter와 ObjectMapper에 대해 이해하고 설정을 변경한다.

HTTP 요청이 오면 Jackson2HttpMessageConverter가 ObjectMapper를 통해 요청을 역직렬화 한다. 스프링부트가 Jackson2HttpMessageConverter에 필요한 ObjectMapper에 대한 의존성을 주입해주는데 이러한 ObjectMapper를 설정하여 setter와 기본 생성자 없이 객체 매핑을 시킬 수 있다.

Object Mapper는 필드명, getter, setter, 기본생성자를 통해 property를 찾는다. 이러한 property와 기본 생성자를 위임 어노테이션에 명시해주면 그 정보를 이용해 직렬화 , 역직렬화를 한다.

또 위임 모듈이 존재하는데 이러한 위임 모듈은 위임 어노테이션에 설정할 정보를 자동으로 탐지해준다.

 

 

메세지 컨버터를 어떻게 설정할까?

 

스프링부트 - @ResponseBody 커스터마이징 Jascskon Converter « 구피개발일기

스프링에서 @ResponseBody로 JSON 응답을 줄 때, Jackson Converter를 커스터마이징 하는 방법에 대해서 포스팅 합니다. 시작하며 API 서버를 만들때, 특정 객체를 JSON 객체로 바꾸어 응답을 줘야합니다. 스

wckhg89.github.io

 

setter와 기본 생성자가 있어야 직렬화, 역직렬화가 가능한데 우리가 쓰는 도메인은 변하면 안되는거 아닌가? 

 

DTO와 VO 그리고 Entity의 차이

본 포스팅은 우아한Tech에 올라온 라흐님의 발표영상 DTO vs VO 영상을 보고 정리한 포스팅이다. 넥스트 스텝에서 클린코드 과정을 이수하면서 DTO와 VO의 차이를 제대로 이해못하고 미션을 수행하

youngjinmo.github.io

클라이언트가 보내는 요청을 어떻게 검증할까?

 

[Spring Boot] Validation 적용, @Valid로 유효성 검사하기

이전에는 spring-boot-starter-web 의존성 내부에 validation이 있었지만, spring boot 2.3 version 이상부터는 아예 모듈로 빠져 validation 의존성을 따로 추가해줘야 사용할 수 있다. 1. validation 의존성 추가 impleme

dev-coco.tistory.com

 

 

@NotEmpty적용 안되는 오류. - 인프런

1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오[질문 내용]'회원 등록' 강의 듣던 중 오류

 

 

 

www.inflearn.com

컨트롤러에서 어떻게 json을 받을까?

 

[SpringBoot] 스프링 controller에서 json 받기 (@RequestBody, @ResponseBody 어노테이션 사용)

@RequestBody, @ResponseBody 어노테이션을 사용하여 컨트롤러에서 JSON 데이터를 주고받을 수 있다. api 요청 프로그램으로 사용한다면 Content-Type을 꼭 application/x-www-form-urlencoded 로 설정해주어야 한다. 1.

sudo-minz.tistory.com

form 태그를 통한 요청은 어떤 형식으로 올까?

 

HTTP 요청 데이터 - GET, POST, BODY

HTTP 요청 데이터 - GET, P

 

OST, BODY

velog.io

 

 

 

클라이언트에서 Json형식을 어떻게 서버에 보낼까?

 

 

Json 데이터 전송하기 (application/json)

Json 데이터 전송하기 (application/x-www-form-urlencoded, application/json) 클라이언트에서 서버로 데이터를 전송하려할 때, 데이터를 Json 포멧으로 만들어서 보내는 것이 일반적인 형태 중 하나입니다. 이

caileb.tistory.com

 

 

[Javascript] JSON stringify 사용법, parse 사용법(JSON과 메서드)

JSON(JavaScript Object Notation)은 값이나 객체를 나타내주는 범용 포맷으로, RFC 4627 표준에 정의되어 있습니다. JSON은 본래 자바스크립트에서 사용할 목적으로 만들어진 포맷입니다. 그런데 라이브러

sewonzzang.tistory.com

 

 

JS에서 받은 데이터를 JSON으로 보내기

HTML과 JS로 프론트엔드를 구성하였고, 여기서 받은 데이터를 spring으로 보내주려고 하는 과정이 있었다. 데이터를 입력하는 id값을 $('이런 변수를 토대로 합쳐셔 key:value값인 json형태를 만들어준

velog.io

 

 

GET & POST + JSON 주고 받기

참고 https://eastflag.co.kr/fullstack/rest-with-nodejs/node-rest_get-post/ angular, react, vue 등의 최신프런트엔드로 풀스택 개발 백엔드는 spring boot, Node로 프런트엔드는 react, angular, vue 의 최신프런트엔드를 사용

duckgugong.tistory.com

 

 

JavaScript에서 JSON 객체 배열 사용하기

이 튜토리얼에서는 JSON 객체 배열에 대해 설명합니다.

www.delftstack.com

 

어떤 원리로 직렬화 되는가?

 

Jackson 데이터 바인딩 에러! (InvalidDefinitionException - No serializer found for class)

JACKSON DATABINDING ERROR

velog.io

builder 패턴을 어떻게 효율적으로 쓸 수 있을까?

 

Builder 기반으로 객체를 안전하게 생성하는 방법 - Yun Blog | 기술 블로그

Builder 기반으로 객체를 안전하게 생성하는 방법 - Yun Blog | 기술 블로그

cheese10yun.github.io

form 데이터를 처리하는 여러 방식

 

Form 데이터 주고 받기 [Spring, HttpServletRequest]

본 게시글은 Seoul wiz의 신입SW인력을 위한 실전 자바(Java) 스프링(Spring)을 참고하여 작성한 글입니다. Form태그, 즉 View의 데이터를 Server로 주고 받는 방식에 대해 알아보자. HttpServletReqest HttpServletRe

howtolivelikehuman.tistory.com

URL를 파라미터로 어떻게 사용하는가? (@PathVariable)

 

MVC 어노테이션 정리

필자는 최근에 spring 강의를 뒤져가며 공부를 다시 하고 있다. 그전에는 그냥 사용하기에 급급했기에 비슷한 어노테이션이 나오게 되면 차이점을 잘 몰랐다. 그렇기에 이렇게 정리를 하고자 한

tech-monster.tistory.com