728x90

0.  스프링 강의 듣는 공부 일지

강의 주소 : 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 | 김영한 - 인프

김영한 | 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확

www.inflearn.com


1. 스프링을 왜 공부해야 하는가...

=> 실무에서 제대로 동작하는 웹 애플리케이션을 개발하기 위해서

강의 목표 : 스프링을 어떻게 사용해야 하는가

미니 프로젝트 주제 : 간단한 웹 애플리케이션 개발

+a) 추후과제

더보기

+a) 추후과제

퍼블릭 클라우드 위에 서비스 배포 및 유지 보수(CI/CD를 이용한)

React Native를 이용한 Android, ios 등 기기 상관없는 서비스 배포...(표현 용어 있었던 것 같은데) 


2. Index

더보기

프로젝트 주제 : 간단한 웹 애플리케이션 개발

1. 스프링 프로젝트 생성 및 스프링 부트로 웹 서버 실행

2. 회원 도메인 개발

3. 웹 MVC 개발

4. DB연동 - JDBC, JPA, 스프링 데이터 JPA

5. 테스트 케이스 작성


3. Tool stack

- spring boot

- Gradle

- Thymeleaf

- JPA ( Java Persistence API )

- Hibernate

- Tomcat


4. Project Setting

하지만 나는 기존에 java22를 사용하기에 일단 22로 하기로 함...

다운 받은 후, 압축을 풀어서 인텔리제이에서 프로젝트로 실행한다.

위와 같이 계속해서 외부에서 라이브러리를 다운받아 열리는 과정이 계속된다

 

  • 프로젝트 폴더 구성
    • src 하위 폴더의 main과 test는 Maven과 Gradle 둘 다 표준화 되어 있다.
      test 하위의 테스트 코드가 중요하다는 얘기 ( 테스트코드와 관련된 소스들이 들어가는 폴더)

 

main 폴더의 이미 생성된 클래스의 메인메서드를 실행

현재 아무것도 작성한 것이 없어서 위의 에러 페이지가 정상인 모습.

 


 

1. 스프링 프로젝트 생성 및 웹 서버 실행


(1) Welcome page 만들기

<!--파일경로 : resources/static/index.html -->

<!DOCTYPE HTML>
<html>
<head>
 <title>Hello</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>

 

 

Spring Boot Features

Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest

docs.spring.io

  • static/index.html 을 올려두면 welcome page를 제공한다.

hello를 클릭하면 이전의 404에러의 페이지가 나오도록 했다

이전 포스팅과 다르게 페이지의 주소 가장 마지막 부분이 '/hello'가 추가 된 것을 확인 할 수 있다.


(1)-1. Thymeleaf (타임리프)

: JSP, Freemarker와 같은 템플릿 엔진.

템플릿 엔진은 서버에서 HTML 파일을 생성하고 동적으로 데이터를 삽입하여 클라이언트에게 전달하는 데 사용.

     쉽게 말해, HTML 문서 안에 Java 코드의 데이터를 결합해 최종적으로 사용자가 볼 수 있는 완성된 웹 페이지를 만들도록 도와줌.

  • 주요 특징
    1. HTML 기반 템플릿 엔진: Thymeleaf는 HTML 문서와 아주 비슷한 구조.
      즉, 개발자가 기존 HTML 파일을 사용하면서 필요한 부분에만 동적인 데이터를 삽입 가능.
      일반 HTML 파일처럼 브라우저에서 확인할 수 있어 템플릿 작성이 매우 직관적.
    2. 스프링 부트와 통합이 용이: Thymeleaf는 스프링 부트와 자연스럽게 통합.
      스프링 부트에서 제공하는 컨트롤러에서 데이터를 Thymeleaf로 전달하고, 해당 데이터를 웹 페이지에 표시하는 구조를 쉽게 만들 수 있음.
    3. 표현식 지원: Thymeleaf는 ${} 같은 표현식을 사용하여 서버에서 전달된 데이터를 HTML 문서 안에 삽입.
      예를 들어, Java 객체의 데이터를 HTML에 쉽게 바인딩 가능.
      여기서 th:text는 Thymeleaf의 속성으로, ${message}의 값을 HTML에 표시.
    4. 동적 콘텐츠 생성: Thymeleaf는 조건부 렌더링(조건에 따라 HTML의 일부를 표시하거나 숨김), 반복문 등을 지원하여, 동적인 HTML을 쉽게 생성할 수 있음

 

참고

https://hstory0208.tistory.com/entry/Thmeleaf%ED%83%80%EC%9E%84%EB%A6%AC%ED%94%84%EB%9E%80-%ED%83%80%EC%9E%84%EB%A6%AC%ED%94%84%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B8%B0%EB%8A%A5%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

 

Thymeleaf(타임리프)란 ? 타임리프의 기본 기능알아보기

Thymeleaf(타임리프)란 ? 타임리프는 JSP, Freemarker와 같은 템플릿 엔진의 일종으로 다음과 같은 특징을 갖고 있습니다. 서버 사이드 HTML 렌더링 (SSR) 백엔드 서버에서 HTML을 동적으로 렌더링 하는 용

hstory0208.tistory.com

<!-- 경로 : java/controller/HelloController -->
package hello.hello_spring.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.stereotype.Controller;

@Controller
public class HelloController {
    @GetMapping("hello")
    public String hello(Model model) {
        model.addAttribute("data", "hello!!");
        return "hello";
    }
}

<!-- 경로 : resoucres/static/hello-static.html -->
<HTML>
<head>
    <title>
        static content
    </title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</HTML>

 


 

(1)-2. 정적 컨텐츠

<!--파일경로 : resources/static/index.html -->
<HTML>
<head>
    <title>
        static content
    </title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</HTML>

hello-static.html 을 하면 정적컨텐츠를 확인할 수 있음


(1)-3. 정적 컨텐츠와 동적 컨텐츠를 제공하는 방식의 차이

정리정리 채워넣쟈


(2) MVC 와 템플릿 엔진

  • MVC : Model, View, Controller

<-> 정적 컨텐츠와의 차이 : 그냥 간단하게 파일을 고객에게 전달해주는게 정적, mvc와 템플릿 엔진을 이용한 방식은 서버에서 변형을 통하여 HTML을 좀 바꿔서 내려주는 방식

  • API
    : 안드로이드나 아이폰 클라이언트랑 개발을 하기 위하여 JSON 데이터포맷으로 클라이언트에게 데이터를 전달하기 위한 방식 ( Vue, React 등등) 

이전에는 JSP를 가지고도 뷰와 모델을 구분하지 않았지만 요즘 MVC 방식에는 뷰와 모델을 분리해야한다.

간단히, 

> 뷰 : 화면을 그리는데 모든 역량을 집중

> 모델 : 컨트롤러와 같은 비즈니스와 관련된 로직이나 내부 처리에 집중

 

  • 구분하면 좋은 장점 :
    >> 규모가 큰 프로젝트나 기업에서 유지보수하기에 개발자들의 접근이 용이하다,
    >> 즉 내가 작성한 것이 아닌 다른 사람이 작성한 수천라인의 코드라도 접근하기가 상대적으로 쉬워질 수 있다.

Thymeleaf 템플릿의 장점인 사용하여 html를 쓰고 서버없이 열어도 코드를 볼 수 있음
개발자 모드에서의 코드 모습

<!-- 파일경로 : resoureces/templates/hello-template.html >
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

?name=spring!이라고 하니 hello 끝에 spring!이 생겼다

=> 템플릿 엔진을 통해서 동적이 아닌 정적인 방법으로 값을 넘겨줘(치환)
아까와 다른 (empty)가 아닌 spring이라고 출력된 것임


(2)-1. 스프링 웹 개발에서 이야기하는 API 방식

=>객체반환

<!-- 객체반환 : @Controller-->
  @GetMapping("hello-api")
  @ResponseBody
  public Hello helloApi(@RequestParam("name") String name) {
    Hello hello = new Hello();
    hello.setName(name);
    return hello;
 }
  static class Hello {
    private String name;
    public String getName() {
    return name;
 }
  public void setName(String name) {
    this.name = name;
  }
}

@ResponseBody <!-- html에 나오는 body 태그를 의미하는 것이 아닌 http에서 헤더부와 바디부가 있는 것 중 바디부 -->

JSON 형식으로 데이터가 보임

과거 html에서 주로 사용되던 XML방식보다(코드상 <html/></html>열고닫고하는구조)
key:value 형식인 JSON 형식으로 더 많이 사용되고 있음.

 

 

  • 스프링에서 문자를 반환할 때 >
    @Responsebody에 따라 http응답에 데이터를 return
  • 스프링에서 객체를 반환할때 >
    json 형식으로 데이터를 만들어서 http 응답에 반응하는 것이 기본 정책

 

(2)-3. 정리하기  - 강의자료 참고 ★

  • @ResponseBody 를 사용
    HTTP의 BODY에 문자 내용을 직접 반환
    viewResolver 대신에 HttpMessageConverter 가 동작
  • 기본 문자처리: StringHttpMessageConverter
  • 기본 객체처리: MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

 

참고: 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter 가 선택된다. 더 자세한 내용은 스프링 MVC 강의에서 설명하겠다


 

 

 

 

728x90

+ Recent posts