![[스프링부트 #19-1] SSR에서 RestAPI로 전환](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%255B%25EC%258A%25A4%25ED%2594%2584%25EB%25A7%2581%25EB%25B6%2580%25ED%258A%25B8%2B%252319-1%255D%2BSSR%25EC%2597%2590%25EC%2584%259C%2BRestAPI%25EB%25A1%259C%2B%25EC%25A0%2584%25ED%2599%2598%26tag%3DTemplate%2B1%26description%3D%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%252323ec86%26bgEndColor%3D%252323ec86%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3D%26blogTitle%3DGyeongwon%2527s%2Bblog&w=2048&q=75)
1. templates 폴더 내부 삭제
2. 테스트 코드 삭제
3. build.gradle 머스태치 삭제
4. 머스태치 세팅 삭제

5. app 패키지 만들기

6. core 패키지 만들기

7. Resp 유틸만들기
package com.mtcoding.springv1.core.util;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.http.HttpStatus;
@AllArgsConstructor
@Data
public class Resp<T> {
private Integer status;
private String msg;
private T body;
// ResponseEntity 형태로 바로 리턴 (성공)
public static <B> Resp<B> ok(B body) {
return new Resp<>(200, "성공", body);
}
// ResponseEntity 형태로 바로 리턴 (실패)
public static Resp<?> fail(HttpStatus status, String msg) {
return new Resp<>(status.value(), msg, null);
}
public static Resp<?> fail(Integer status, String msg) { // 스프링 도움 안받을때!!
Resp<?> resp = new Resp<>(status, msg, null);
return resp;
}
}
8. 오류잡기
(import package 오류)
9. 마지막 샘플테스트
로그아웃 컨트롤러만 수정함

package com.mtcoding.springv1.app;
import com.mtcoding.springv1.app.dto.JoinRequestDTO;
import com.mtcoding.springv1.app.dto.LoginRequestDTO;
import com.mtcoding.springv1.core.util.Resp;
import com.mtcoding.springv1.domain.user.User;
import com.mtcoding.springv1.domain.user.UserService;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/api")
@RequiredArgsConstructor
@RestController
public class UserApiController {
private final UserService userService;
private final HttpSession session; // IoC에 등록되어 있음.
@GetMapping("/logout")
public Resp logout() {
session.invalidate();
//session.removeAttribute("sessionUser");
return Resp.ok(null); // 오브젝트를 리턴하면 json으로 컨버팅해서 리턴해줌
}
@GetMapping("/join-form")
public String joinForm() {
return "user/join-form";
}
@GetMapping("/login-form")
public String loginForm() {
return "user/login-form";
}
@PostMapping("/join")
public String join(JoinRequestDTO reqDTO) {
userService.회원가입(reqDTO);
return "redirect:/login-form";
}
@PostMapping("/login") // 조회인데, Post는 로그인 밖에 없다. 예외 (URL에 쿼리스트링으로 정보 전달을 안하려고)
public String login(LoginRequestDTO reqDTO) {
User sessionUser = userService.로그인(reqDTO);
session.setAttribute("sessionUser", sessionUser);
return "redirect:/board";
}
}
Share article