spring 1주차강의 복습 / 정리
- 서버 - 클라이언트 간의 정보이동
필요한 것 : 1. IP 주소, 2. Port 번호
- 동적 페이지처리 (웹 어플리케이션 서버에 대해)
빨간 영역 = 기존의 웹 서버, 정적인 페이지 처리후 반환
그 옆에 추가적으로 붙어있는 Web Container (서블릿)이 동적인 페이지를 처리해주는 역할담당
Front Controller 패턴 (Spring은 DispatcherServlet을 사용해서 이 패턴을 구현)
@Controller << 위 controller에 해당, 애너테이션 선언된 클래스가 컨트롤 담당
// 클라이언트의 요청이 들어오면 Handler Mapping가 올바른 url에 대해
// Mapping 애너테이션이 선언된 해당하는 메서드로 안내!
@RequestMapping("/api")
public class BasicController {
@GetMapping("/basic")
public String basic() {
return "spartaFlix.html"; << 리턴값은 디스패처 서블릿에 의해 View Resolver 로전달
}
View Resolver는 전달받은 view name을 완전한 경로로 만들어줌
ex) resource폴더내부 -> static폴더 또는 templates폴더 쪽 html 파일들 경로
../templates/spartaFlix.html
static 폴더
- SpringBoot 서버에 html 파일을 바로 요청하면 해당 html 파일을 static 폴더에서 찾아서 반환해 줍니다.
- 코드상에서 따로 return 안해줘도 서비스 제공 url에 접속하기만 하면 바로 html이 뜸
- Redirect를 통해 static 폴더의 html 파일을 Controller를 통해 처리가능! <템플릿 엔진을 적용한 상태기준>
@GetMapping("/html/redirect")
public String htmlStatic() {
return "redirect:/hello.html";
}
templates 폴더
- 타임리프 dependency 설정시 컨트롤러 메서드의 리턴값이 타임리프 default 설정과 합쳐져 경로를 나타냄 메서드 자체적으로는 view name 값만 리턴하면된다
- 타임리프 default 설정
- prefix: classpath:/templates/
- suffix: .html
@GetMapping("/html/templates")
public String htmlTemplates() {
return "hello"; << view name
}
// 이러면 /templates/hello.html 이라는 값으로 타임리프에 의해 완전경로로 만들어짐
- 동적인 페이지 처리
- Client 의 요청을 Controller에서 Model 로 처리합니다.
- Template engine(Thymeleaf) 에게 View, Model 전달합니다.
- View: HTML 파일 (동적으로 동작하게 만들어짐 by JS 시리즈)
- Model: View 에 적용할 정보들 ( =객체데이터<클래스> )
- View에 Model을 적용 → 동적 웹페이지 생성
- Client(브라우저)에게 View(동적 웹 페이지, HTML)를 전달 해줍니다.
코드
@GetMapping("/basic/dynamic")
public String dynamicBasic(Model model) {
int count = 77777;
String name = "연습";
model.addAttribute("lucky7",count);
model.addAttribute("name",name);
return "spartaFlix";
}
-------------------------------
// th: 으로 시작한 html 내부 코드에서 ${ } 안에 있는 변수와 매칭
th:title = "${lucky7}"
<span th:text = "${name}"></span>
- Jackson 라이브러리
- Jackson은 JSON 데이터 구조를 처리해주는 라이브러리 입니다.
- Object를 JSON 타입의 String으로 변환해줄 수 있습니다.
- JSON 타입의 String을 Object로 변환해줄 수 있습니다.
@Test
@DisplayName("Object To JSON : get Method 필요")
void test1() throws JsonProcessingException {
Star star = new Star("Robbie", 95);
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
String json = objectMapper.writeValueAsString(star);
System.out.println("json = " + json);
}
// objectMapper의 writeValueAsString 메서드를 사용하여 변환할 수 있습니다.
@Test
@DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
void test2() throws JsonProcessingException {
String json = "{\"name\":\"Robbie\",\"age\":95}"; // JSON 타입의 String
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
Star star = objectMapper.readValue(json, Star.class);
System.out.println("star.getName() = " + star.getName());
}
//objectMapper의 readValue 메서드를 사용하여 변환할 수 있습니다.
코드 연습
다양한 애너테이션
@Controller
@RequestMapping("/api")
public class BasicController {
@GetMapping("/basic")
public String basic() {
return "spartaFlix.html"; // html 파일내용 출력
}
@PutMapping("/basic2")
public String putBasic(){
return "{id: lee, name: eno, contents: 연습}"; // 오류 - status 500,
}
@PostMapping("/basic3")
public Memo postBasic(){
return new Memo("id","2eno","연습"); // 오류 - status 500,
}
@DeleteMapping("/basic4")
@ResponseBody
public Memo deleteBasic() {
return new Memo("id","2eno","연습"); // Json 출력
}
//그 외 : url 주소값이 같은 메서드가 2개이상 있으면 컴파일은 상관없지만 실제 요청시 오류!
// GET http://localhost:8080/api/param/robby/777
@RestController
@RequestMapping("/api")
public class PrepareClass {
@GetMapping("/param/{name}/{id}")
public Memo test1(@PathVariable String name, @PathVariable long id){
return new Memo("아이디 "+id ,name,"연습");
}
}
// GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
+ HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 수 있습니다.
클라이언트(브라우저)의 HTTP 요청을 보낼때 데이터를 함께 보내는 방식
@PathVariable , @RequestParam
HTTP 데이터를 객체로 처리하는 방식
@ModelAttribute , @RequestBody
form 태그를 사용하여 POST 방식으로 HTTP 요청 ->
HTTP Body에 name=Robbie&age=95 형태로 담겨져서 서버로 전달됩니다.
// [Request sample]
// POST http://localhost:8080/hello/request/form/model
// Header
// Content type: application/x-www-form-urlencoded
// Body
// name=Robbie&age=95
@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
HTTP Body에 JSON 데이터를 담아 서버에 전달할 때 해당 Body 데이터를 Java의 객체로 전달 받을 수 있습니다.
// [Request sample]
// POST http://localhost:8080/hello/request/form/json
// Header
// Content type: application/json
// Body
// {"name":"Robbie","age":"95"}
@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
DTO : 데이터 전송 및 이동을 위해 생성되는 객체
- Client에서 보내오는 데이터를 객체로 처리할 때 사용됩니다.
- 또한 서버의 계층간의 이동에도 사용됩니다.
- DB와의 소통을 담당하는 Java 클래스를 그대로 Client에 반환하는 것이 아니라 DTO로 한번 변환한 후 반환할 때도 사용됩니다.
'TIL > Web Back' 카테고리의 다른 글
[Sparta] 내일배움캠프 TIL 19일차 (0) | 2024.05.17 |
---|---|
[Sparta] 내일배움캠프 TIL 18일차 (0) | 2024.05.16 |
[Sparta] 내일배움캠프 TIL 16일차 (2) | 2024.05.13 |
[Sparta] 내일배움캠프 TIL 15일차 (0) | 2024.05.12 |
[Sparta] 내일배움캠프 TIL 14일차 (0) | 2024.05.09 |