Framework/Springboot

[Springboot] Controller (get / post)

웹개발자(진) 2024. 5. 9. 15:04
반응형
잡담

오늘은 Springboot에서 RestController를 이용해서 json처리하는 방법과 해당 결과를 출력하는 thymeleaf에 대한 예제와 get / post 방식에 대한 몇 가지 들어서 공부해 볼 예정입니다. 


 

 

1. @GetMapping

Spring Boot에서 @GetMapping은 HTTP GET 요청을 처리하는 데 사용되는 어노테이션입니다. 이 어노테이션을 메소드에 적용하면 해당 메서드가 지정된 경로로 들어오는 GET 요청을 처리할 수 있습니다.

이전 게시글에서 작성했던 예제를 다시한번 가져왔습니다.

package org.zerock.b01.Controller;

import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
@Log4j2
public class SampleController {
    // "/hello" 경로로 GET 요청이 들어왔을 때 실행되는 메소드
    @GetMapping("/hello")
    public void hello(Model model) {
        // 로그 출력
        log.info("hello......");
        // 모델에 "msg" 속성 추가
        model.addAttribute("msg","Hello World");
    }
}

위의 코드는 /hello 경로로 GET 요청이 들어왔을 때 실행되는 hello() 메소드를 가진 컨트롤러 클래스입니다. 해당 메서드는 "Hello, World!"를 모델에 추가하고 로그를 출력합니다. Servlet에서 request에 데이터를 담아서 이동하는 것과 다르게 Springboot에서는 model에 담아서 이동합니다. 

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1 th:text="${msg}"></h1>
</body>
</html>​
  • <html xmlns:th="http://www.thymeleaf.org"> : Thymeleaf 네임스페이스를 선언하여 Thymeleaf의 속성을 사용할 수 있도록 합니다.
  • <h1 th:text="${msg}"></h1>: 제목을 표시하는 <h1> 태그입니다. 여기서는 Thymeleaf의 th:text 속성을 사용하여 동적으로 데이터를 표시합니다. ${msg}는 컨트롤러에서 전달된 모델 속성의 값을 나타냅니다. Thymeleaf는 이 값을 표시할 때 해당 위치에 동적으로 삽입합니다.

 


 

2. @PostMapping

Spring Boot에서 @PostMapping은 HTTP POST 요청을 처리하는 데 사용되는 어노테이션입니다. 이 어노테이션을 메소드에 적용하면 해당 메서드가 지정된 경로로 들어오는 POST 요청을 처리할 수 있습니다.

package org.zerock.b01.Controller;

import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.zerock.b01.dto.MemberDTO;

@Controller
@Log4j2
public class SampleController {

	@GetMapping("/memInsert")
    	public void memInsert(Model model){
    }
    
    // "/memInsert" 경로로 POST 요청이 들어왔을 때 실행되는 메소드
    @PostMapping("/memInsert")
    public String memInsert(@ModelAttribute MemberDTO memberDTO, Model model){
        // MemberDTO 객체의 정보를 문자열로 만들어서 info에 저장
        String info = memberDTO.getName() + ", "+memberDTO.getEmail() + ", "+memberDTO.getAge();
        // 모델에 "info" 속성으로 저장
        model.addAttribute("info",info);
        // 결과를 "result" 뷰로 반환
        return "result";
    }
}

 

위의 코드는 Spring Boot에서 POST 요청을 처리하는 예시입니다.

@PostMapping("/memInsert")은 "/memInsert" 경로로 들어오는 POST 요청을 처리하는 memInsert() 메서드를 선언합니다. 이 메서드는 MemberDTO 객체를 받아와서 처리합니다.

@ModelAttribute 어노테이션은 요청 본문에 있는 데이터를 자바 객체로 매핑하도록 스프링에 지시합니다. 이 예시에서는 MemberDTO 객체로 매핑합니다.

Model 객체는 컨트롤러에서 뷰로 데이터를 전달하는 데 사용됩니다. 여기서는 info라는 이름으로 memberDTO의 정보를 문자열로 만들어 모델에 추가합니다.

마지막으로 "result"라는 뷰 이름을 반환합니다.

이렇게 하면 Spring Boot 애플리케이션에서 POST 요청을 처리하고 결과를 뷰로 전달하는 간단한 컨트롤러를 만들 수 있습니다. 결과를 "result"라는 뷰로 전달하므로, 해당 뷰에서는 "info"라는 모델 속성을 사용하여 결과를 표시할 수 있습니다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form th:action="@{/memInsert}" method="post">
        <label for="name">username:</label>
        <input type="text" id="name" name="name" required><br>
        <label for="email">email:</label>
        <input type="email" id="email" name="email" required><br>
        <label for="age">age:</label>
        <input type="number" id="age" name="age" required><br>
        <button type="submit">입력</button>
    </form>
</body>
</html>​

위의 코드는 Thymeleaf를 사용하여 간단한 입력 폼을 생성하는 HTML 코드입니다. 이 폼은 사용자의 이름, 이메일 및 나이를 입력할 수 있는 폼입니다. 제출 버튼을 클릭하면 이 정보가 POST 방식으로 "/memInsert" 경로로 전송됩니다.

Thymeleaf의 속성을 사용하여 폼의 action 속성을 동적으로 설정하고 있습니다. th:action="@{/memInsert}"는 "/memInsert" 경로로 폼이 제출될 것임을 나타냅니다.

이렇게 하면 사용자가 정보를 입력하고 제출할 수 있는 간단한 입력 폼을 만들 수 있습니다.

출력값
출력값

 


 

3. 다양한 출력

servlet과 Springboot의 차이점? 중 하나는 클래스를 view쪽으로 넘겨줄 수 있느냐 없느냐이다.

Spring Boot의 컨트롤러는 뷰로 클래스 객체를 전달할 수 있습니다. 이것은 Spring의 MVC (Model-View-Controller) 아키텍처의 핵심 원칙 중 하나인 모델(Model)을 통한 데이터 전달에 의해 이루어집니다.

Spring MVC에서 컨트롤러는 모델에 데이터를 추가하고, 이를 뷰로 전달합니다. 컨트롤러가 생성한 모델의 데이터는 뷰 템플릿(예: Thymeleaf, JSP 등)에서 사용될 수 있습니다. 따라서 컨트롤러에서 생성한 클래스 객체도 모델에 추가하여 뷰로 전달할 수 있습니다.

예를 들어, 다음은 Spring Boot 컨트롤러에서 클래스 객체를 모델에 추가하여 뷰로 전달하는 간단한 예제입니다:

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

@Controller
public class SampleController {

    @GetMapping("/example")
    public String example(Model model) {
        // 클래스 객체 생성
        ExampleClass exampleClass = new ExampleClass();
        
        // 모델에 클래스 객체 추가
        model.addAttribute("exampleObject", exampleClass);
        
        // 뷰 이름 반환
        return "exampleView";
    }
}

위의 코드에서는 /example 경로로 GET 요청을 처리하는 example() 메서드가 있습니다. 이 메서드는 ExampleClass라는 클래스의 객체를 생성하고, 이를 모델에 "exampleObject"라는 이름으로 추가합니다. 그리고 "exampleView"라는 뷰 이름을 반환합니다.

"exampleView"라는 뷰 템플릿에서는 Thymeleaf나 Freemarker와 같은 템플릿 엔진을 사용하여 모델에 추가된 클래스 객체를 사용할 수 있습니다. 이렇게 함으로써 컨트롤러에서 생성한 클래스 객체를 뷰로 전달할 수 있습니다.

실제로 출력이 되는지 예제를 들어서 확인해보도록 하자.

package org.zerock.b01.Controller;

import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.zerock.b01.dto.MemberDTO;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

@Controller
@Log4j2
public class SampleController {
    // 내부 클래스 SampleDTO 선언
    class SampleDTO{
        private String p1,p2,p3;
        public String getP1(){return p1;}
        public String getP2(){return p2;}
        public String getP3(){return p3;}
    }

    // "/ex/ex2" 경로로 GET 요청이 들어왔을 때 실행되는 메소드
    @GetMapping("/ex/ex2")
    public void ex2(Model model){
        // 1부터 9까지의 숫자로 이루어진 문자열 리스트 생성
        List<String> strList = IntStream.range(1,10).mapToObj(i->"STR"+i)
                .collect(Collectors.toList());

        // 모델에 문자열 리스트 추가
        model.addAttribute("strList",strList);

        // HashMap 생성 및 초기화
        Map<String, String> map = new HashMap<>();
        map.put("A","AAAA");
        map.put("B","BBBB");

        // 모델에 맵 추가
        model.addAttribute("map",map);

        // 내부 클래스 SampleDTO의 객체 생성 및 값 설정
        SampleDTO sampleDTO = new SampleDTO();
        sampleDTO.p1 ="p1p1p1p1p1";
        sampleDTO.p2 ="p2p2p2p2p2";
        sampleDTO.p3 ="p3p3p3p3p3";

        // 모델에 SampleDTO 객체 추가
        model.addAttribute("sampleDTO",sampleDTO);

    }
}

이 코드는 "/ex/ex2" 경로로 GET 요청이 들어오면 실행되는 컨트롤러 메서드를 정의하고 있습니다. 이 메서드는 모델에 문자열 리스트, 맵 및 SampleDTO 객체를 추가하여 뷰로 전달합니다. 이러한 데이터는 뷰에서 템플릿 엔진(예: Thymeleaf)을 사용하여 사용자에게 표시될 수 있습니다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div th:text="${strList}"></div>
    <div th:text="${map}"></div>
    <div th:text="${sampleDTO}"></div>

<script th:inline="javascript">

    const list = [[${strList}]]
    const map = [[${map}]]
    const dto = [[${sampleDTO}]]

    console.log(list)
    console.log(map)
    console.log(dto)
</script>
</body>
</html>

 

이 코드는 Thymeleaf의 문법을 사용하여 모델에 추가된 데이터를 출력하고, JavaScript 코드를 통해 해당 데이터를 처리합니다.

  • <div th:text="${strList}"></div>: 문자열 리스트를 출력하는 <div> 요소입니다.
  • <div th:text="${map}"></div>: 맵을 출력하는 <div> 요소입니다.
  • <div th:text="${sampleDTO}"></div>: SampleDTO 객체를 출력하는 <div> 요소입니다.

JavaScript 코드는 Thymeleaf의 th:inline="javascript" 속성을 사용하여 JavaScript 코드 내부에서 Thymeleaf 표현식을 사용할 수 있도록 합니다. 이를 통해 문자열 리스트, 맵 및 SampleDTO 객체를 JavaScript 배열 및 객체로 변환하고, 이를 콘솔에 출력합니다.

입력

 


 

4. RestController

Spring Boot에서 @RestController는 JSON 또는 XML 형식으로 HTTP 요청에 응답하는 데 사용되는 어노테이션입니다. 이 어노테이션을 컨트롤러 클래스에 적용하면 해당 컨트롤러는 주로 RESTful 웹 서비스에서 사용됩니다. 각각의 요청은 HTTP 요청 메서드(GET, POST, PUT, DELETE 등)에 따라 적절한 응답을 생성합니다.

간단한 예를 들어보겠습니다:

package org.zerock.b01.Controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleJSONController {
    @GetMapping("/helloJSON")
    public String[] helloJSON1234(){
        return new String[]{"AAA","BBB","CCC"};
    }
}

 

출력값

 


 

글을 마치며

오늘은 Controller에서 GetMapping, PostMapping, RestController에 대해서 알아 봤습니다. 또 해당 내용을 출력할 수 있는 thymeleaf문법에 대해서도 조금 알아봤습니다. servlet에서 쓰던 내용들을 '@' annotation으로 간단하게 사용하고 request, response에 담던 정보들을 model이라는 하나의 매개변수에 담아서 전달할 수 있었습니다. 또한 urlpattern이 html명과 매칭되어 조금 더 직관적으로 mvc패턴을 만들 수 있는 것 같습니다. 감사합니다.

반응형

'Framework > Springboot' 카테고리의 다른 글

[Springboot] thymeleaf 조건문 if  (0) 2024.05.31
[Springboot] Session이란?  (0) 2024.05.30
[Springboot] Scope란?  (0) 2024.05.30
[Springboot] DB설정 / JPA  (0) 2024.05.09
[Springboot] Springboot 기본  (0) 2024.05.08