web/스프링

<스프링 입문> 스프링 웹 개발 기초

nongdamgom 2024. 1. 30. 00:22

 

인프런 <스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술> by 김영한

 

 

섹션 1

기본 환경설정

 

예전에 인텔리제이를 깔아둬서 그냥 인텔리제이를 사용하기로 함(이클립스 지워야지...ㅎ)

 

일단 

 

start.spring.io로 가서 기본 설정 해주고 generate 해주면, 기본파일 zip이 다운로드됨

그걸 인텔리제이에서 열어주면 끝.

 

maven 과 gradle => 요즘은 gradle을 많이 쓴다고 한다.

 

들으면서 메모해둔 내용 자잘한 내용

더보기

라이브러리
thymeleaf, web, test 이 세가지 사용 중
근데 실제라이브러리 들어가보면 엄청나게 많음 => 요즘에는 웹 만들 때 이정도 라이브러리는 다 땡기고 시작해야 함
예를들어 starter-web 같은 라이브러리 하나만 써도, 의존관계 엮여있는 라이브러리 다 같이 땡겨옴(gradle 이)
그냥 자바 메소드 하나 실행해주면 웹이 뜬다.. 편해졌다.

현업에선 println 보다 "로그"를 사용해서 출력 
logback을 이용해서 로그를 출력...  +  slf4도 사용

 

 

스프링 부트 기본 구조

  • 라이브러리같은건 차치하고, 제일 중요해보이는 것

 

  • src의 main 내에 java 폴더resources 폴더 존재
  • java : main 함수와 controller 존재
  • resources : 사용되는 파일 모음  

 

controller ? 
  • 스프링 내에서 웹과 연동을 시킬 때 이거저거 하게 만드는거..?
  • 설명하라고 하니 모르겠음 그냥 느낌적인 느낌으로 보면 앎

 

 

웹 띄우는 방법

package hello.hellospring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloSpringApplication {

	public static void main(String[] args) {
		SpringApplication.run(HelloSpringApplication.class, args);
		/* springbootapplication이 tomcat 이라는 서버를 내장하고 있어서
		main을 실행해주면 그 서버를 자체적으로 띄우면서 스프링부트를 실행한다.*/
	}

}
  • 여기서 그냥 main 함수 실행하면 localhost 포트 번호가 생성되고, 아무 브라우저에다가 그 포트번호를 던지면 된다.

 

*** 커맨드로 띄우는 방식(IDEA를 사용하지 않고 서버 배포할 때)

 

  • 파일 있는 곳에 가서 gradlew build 

 

  • build 성공하면 cd build, cd libs 한 후 
  • dir 명령어 치면, 내가 만든 스프링부트의 jar 파일이 보일거임
  • 이후 java -jar (jar 파일 이름 복붙)
  • 이렇게 해주고 포트번호만 복붙해서 뿌리면 됨

 

섹션 2 

웹 개발 기초

 

스프링에서 웹을 띄우는 방식이 크게 세가지 존재

 

1. 정적 컨텐츠

2. MVC와 템플릿 엔진

3. API

 

 

1. 정적 컨텐츠

  • 컨트롤러가 없으면 스프링부트가 자동으로 static 밑 파일을 검색
  • 거기에 있는 파일을 그냥 냅다 웹으로 던져서 반환
  • 서버에서 html을 수정하지 못하고 그냥 단순하게 띄워주기만 할 수 있다.

 

 

2. MVC와 템플릿 엔진

  • MVC : Model, View, Controller

  • 컨트롤러가 존재함
  • 컨트롤러 내에서 mapping된 method를 보고, 반환값(html 파일 이름)을 확인
  • template 파일 밑에 반환값으로 된 파일을 웹에 띄워줌
@Controller
public class HelloController {

    @GetMapping("hello") // web /hello(클릭 했거나 웹이 hello로 움직였다는 뜻) 로 갔을 때 이 method를 호출해줌
    public String hello(Model model){
        model.addAttribute("data", "hello!!");  //그럼 여기서 나타내줄 값 넣어줌
        return "hello"; // html 파일 이름 => hello.html로 렌더링 해라(기본적으로 템플릿 밑의 파일을 찾음)
    }

    @GetMapping("hello-mvc")
    /* @RequestParam(value :  넘어올 값, required : 디폴트는 true, false로 하면 값 안넘겨도 됨)
    웹에서 /hello-mvc?name= 여기로 넘어올 값이 value 값 == 즉 name으로 넘어갈 파라미터 값*/
    public String helloMvc(@RequestParam(value = "name") String name, Model model){
        model.addAttribute("name", name);
        return "hello-template";
    }
}
  • 당연히 파라미터값 받기 가능

  • 이런식으로 웹에서 넘겨주는 값을 받아서 처리를 해줌 
  • 정적 컨텐츠와 달리 서버에서 html 수정을 할 수 있음
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
<!--hello! empty는, 이 html 파일을 웹 자체에 던졌을 때 (그러니까 정적으로 열었을 때?) 보여지는 내용
 템플릿을 사용해서 html 파일을 활용하면 태그 내부의 내용으로 저 내용이 치환이 된다고 한다.-->
</body>
</html>
  • 이런식으로 hello-template 내의 html 코드를 수정해서 웹으로 보내는 방식
  • controller에서 model에 속성을 추가해주고
  • html에서 model의 key 값을 활용하여 ${name} 이런식으로 넣어주면, value 값으로 도출됨.

 

 

3. API

  • 컨트롤러가 넘어와서 @ResponseBody를 사용 
  • 위에서 반환값을 viewResolver로 넘겨준것과 달리, Http body부분 자체를 수정한다.

 

@Controller
public class HelloController {

    @GetMapping("hello-string")
    @ResponseBody // 파라미터로 받은 값으로 html 태그를 수정하는 방식(mvc)이 아니라, 단순 무식하게 string 자체를 변환해서 띄워줌
    public String helloString(@RequestParam("name") String name){
        return "hello " + name;
    }

    @GetMapping("hello-api")
    @ResponseBody
    // 이게 진짜 많이 쓰이는 api 방식 => json 방식
    /* json? key value로 이루어진 구조 */
    // 요즘 많이 쓰이는 방식이라고 한다.
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
        /* @ResponseBody 를 보면 컨트롤러가 viewResolver 대신에 HttpMessageConverter 을 동작시킴
        위의 경우처럼 일반 string이라면 StringConverter를 동작시키고
        지금처럼 객체를 넘기는 경우라면 JsonConverter를 동작
         */
    }

    static class Hello{
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

}
  • viewResolver가 resources 밑의 html 파일을 보고 변환하는 것이 아니라,
  • 그냥 웹으로 바로 mapping된 주소를 던지면 http가 바로 변환되고, 그대로 웹에 띄워진다.
  • api를 쓰는 것은 대부분 json 방식을 사용한다고 생각하면 된다고 한다.
  • 즉 return hello 부분에서 객체를 넘겨주면, "name"이 키가 되고, 파라미터로 입력 받을 값이 value가 돼서

이런 식으로 웹에 띄워지게 된다.