spring boot
-
[Spring Boot] @ModelAttribute 와 @RequestBody 의 차이프로그래밍 2023. 5. 21. 19:47
그동안 스프링 부트로 서버를 개발하면서 @ModelAttribute 와 @RequestBody의 정확한 차이를 모르고 그냥 MVC에서는 @ModelAttribute, REST API 개발에서는 @RequestBody 를 사용했다. 하지만 이번 팀 프로젝트에서 프론트와 백엔드를 붙이면서 여기서 문제가 발생했다. @ModelAttribute 는 URL에서 파라미터로 데이터를 전송할 때 해당 파라미터를 DTO 객체와 매핑시켜준다. 또한 이렇게 동작하기 위해서는 프론트에서 Content-Type 을 반드시 application/x-www-form-urlencoded 이나 multipart/form-data 로 설정해주어야 한다. @RequestBody 는 프론트에서 보낸 request 에서 body 를 파싱해서..
-
[Spring Boot] CORS 문제프로그래밍 2023. 5. 21. 19:41
팀 프로젝트 개발을 하던 도중에 CORS 문제가 발생하였다. 이번 팀 프로젝트에서 프론트 서버와 백엔드 서버를 나눠서 개발하기로 했는데, 두 개를 한 컴퓨터에서 포트를 바꿔 동시에 실행하고 데이터 송수신을 테스트하던 도중에 문제가 발생했다. 이유는 localhost더라도 포트가 다르기 때문에 origin이 달라 오류가 발생한 것이다. 이를 해결하기 위해서는 백엔드 서버에서 수신할 origin을 설정해주면 간단하게 해결된다. @RequiredArgsConstructor @RestController public class LoginApiController { private final LoginService loginService; @CrossOrigin(origins = "http://localhost:80..
-
스프링 부트 command 객체Spring Boot 2021. 9. 14. 22:04
제목 내용 작성자 이전에는 thymeleaf를 통해 뷰에서 컨트롤러로 객체를 전달하려 했다. 그런데 이렇게 하려면 boardRegister() GET 메소드의 매개변수로 BoardDto가 있어야 했다. 왜냐하면 객체가 전달되어 있어야 th:object="${boardDto}"를 수행할 수 있기 때문이다. 그래서 GET 메소드와 POST 메소드 둘 다에 매개변수가 있어야 했는데 이해하기 어려웠고 로직이 맞지 않는 것 같았다. 왜냐하면 뷰에서 컨트롤러로 전달할 때에는 Command 객체를 사용하고, 컨트롤러에서 뷰로 전달할 때에는 Model을 사용하는 걸로 알고 있었기 때문이다. 그러나 책을 천천히 읽으면서 이해할 수 있었다. 제목 내용 작성자 Command 객체는 각 엘리먼트의 name과 똑같은 set##..
-
스프링 부트 thymeleaf id 뷰에서 컨트롤러로 받아오기Spring Boot 2021. 9. 14. 21:38
@GetMapping("/boardDelete") public String deleteBoard(@RequestParam("id") Long id) { repository.deleteById(id); return "redirect:/board"; } 컨트롤러 삭제 뷰(일부) 처음에는 뷰의 2번째 줄에 id="id"를 추가하여 컨트롤러의 @RequestParam("id")와 연결시키려 했었다. 하지만 오류 페이지를 보니 인식할 수 없었다. 해결 방법은 하이퍼링크에 ${board.id}를 전달하는 것이다. thymeleaf는 컨트롤러에서 뷰로 객체를 보낼 때에 주로 사용하고 뷰에서 컨트롤러로 보낼 때에는 스프링에서 제공하는 command 객체를 잘 활용하는 게 더 효율적일 것 같다. 참고 https://ww..
-
스프링 부트 controller 오류 해결Spring Boot 2021. 9. 14. 10:40
@GetMapping("/boardRegister") public String getBoardRegister() { return "boardRegister"; } @PostMapping("/boardRegister") public String registerBoard(@ModelAttribute("boardDto") BoardDto boardDto) { repository.save(boardDto.toEntity()); return "redirect:board"; } 이를 실행하면 Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'boardDto' available a..
-
스프링 부트 웹 계층 구조Spring Boot 2021. 9. 9. 23:11
Web Layer: 컨트롤러, 뷰, 예외 처리, 어드바이스 등 Service Layer: @Service 가 사용됨 @Transactional 이 사용되는 영역 Repository Layer: 데이터베이스에 접근 인터페이스로 구현 Dtos: Layer 간에 데이터를 교환 Domain Model 비즈니스 처리 @Entity VO 참고 http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788965402602
-
스프링 부트 HTTP 동작 테스트Spring Boot 2021. 9. 9. 21:31
ToyController package com.example.toy1.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ToyController { @GetMapping("/toy") public String getHello() { return "hello toy"; } } ToyControllerTest package com.example.toy1.controller; import org.junit.jupiter.api.Test; import org.springfr..