[Spring] 간단한 주소 매핑

merci·2023년 1월 10일
0

Spring

목록 보기
1/21

스프링 프로젝트의 동작 과정을 실습을 통해서 알아보자

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

@RestController
// 컨트롤러 지정, endpoint(요청한 메소드)에 따라 메소드선택 
// JVM이 @RestController을 확인하면 현재 클래스를 힙에 생성한다.
// -> 모든 메소드를 소켓의 진입점으로 바꾼다.
// 문자열을 리턴하는 소켓
public class DemoController {
    
    @GetMapping("/hello")  // 매핑시키는 주소와 메소드의 이름은 1:1로 연결되어야함 
    public void hello(){
        System.out.println("디버그 : hello");
        // http://localhost:8080/ 검색하면 디버그 콘솔에 hello 출력
    }

    @GetMapping("/home")
    public String home(){
        String html = "<h1>HOME</h1><hr/>";
        return html;
    }

    @GetMapping("/user")
    public User user(){
        User user = new User();
        user.setId(1);
        user.setUsername("ssar");
        user.setPassword("1234");
        return user; // MessageConverter 발동 (발동조건 - 오브젝트 리턴!!!) 
        // MessageConverter 가 알아서 json으로 파싱해준다
    }   
}
  • 라이브러리 설정
  • 스프링프로젝트 초기세팅에서 체크했던 devtools 라이브러리가 파일저장시 자동으로 컴파일을 해준다
    -> 기능을 추가하고 저장하면 자동 컴파일
  • @RestController가 붙은 클래스는 자동으로 힙에 생성이 되고 서버가 업데이트한다
    @RestController = @Controller + @ResponseBody - 데이터를 반환
    -> 데이터의 종류에 따라 다양한 MessageConverter 이용

이후 서버 실행후 결과들은




이번에는 jsp 파일을 매핑해보자

  • application.yml - ViewResolver 설정
spring:
  output:
    ansi:
      enabled: always
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
// 파일을 리턴하는 소켓
public class ViewController {    

    @GetMapping("/login")
    public String login(){        
        return "login";  // ViewResolver 발동 
        		// -> /src/main/webapp/WEB-INF/views/login.jsp 로 바꿔줌 !!!!
    }
    @GetMapping("/join")
    public String join(){
        return "join";
    }
    @GetMapping("/write")
    public String board(){
        return "board/write";
    }
}
  • 뷰리졸버가 매핑해주는 jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    테스트 로그인
</body>
</html>
  • @Controller 는 뷰를 반환하기 위해 사용한다
  • ViewResolver 는 페이지컨트롤러가 리턴한 뷰를 컴포넌트(jsp) 와 매핑 -> html


결과들은



여기까지는 정적인 페이지


동적인 페이지를 간단히 만들어 보자

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

@Controller
public class ViewController {    

	@GetMapping("/login")
    public String login(Model model){ // Model 객체이용
        Random r = new Random();
        int result = r.nextInt(10);
        model.addAttribute("num",result); // 속성값을 추가한다  
        return "login";
    }
 }
    // 매핑할 jsp 파일에 '${num}' 추가 ( <- num은 자바코드)
  • http://localhost:8080/login 을 입력할때마다 다른값( ${num} <- 랜덤 ) 출력

  • @Controller의 메소드는 Model 객체를 파라미터로 받을 수 있다.
    -> Model클래스를 만들 필요없이 Spring에서 알아서 만들어 준다.
    ( JSP 였다면 request나 session 객체를 이용, Spring은 Model 객체를 사용함 )

  • 서버단에서 자바코드를 해석해서 순수한 html( 문자열 )로 응답해주는걸 서버사이드렌더링( SSR )이라고 한다 ( 매번 요청마다 SSR 후 랜덤한 숫자를 리턴해줌 )

  • 템플릿 엔진이( JSP ) html 코드안에 다른언어( 자바 )를 사용하게 해준다




( 추가내용 )

  • WEB-INF 는 보안폴더로 이용 - url 로 접근 못한다.
  • 리소스에 static은 아무나 접근이 가능하다 - 보안에 취약하니 주의




profile
작은것부터

1개의 댓글

comment-user-thumbnail
2023년 1월 20일

와! 감동감동!
길 좀 알려주세요!!
당신의 마음으로 가는 길!!

답글 달기