본문 바로가기
JAVA & SPRING/Spring 입문

스프링 입문강의-1일차 (스프링이란..)

by 눈오는1월 2023. 7. 14.
728x90

인프런 김영한님 강의를 듣고 정리하려고 한다. (정리를 그렇게 잘하는 편은 아니지만.. 일단 정리하면서 내 머릿속도 같이 장리한다는 느낌으로)

스프링을 하면 이제 https://start.spring.io/ 여기서 스프링 파일을 생성할텐데 

project를 보면 Gradle 과 Maven이 존재한다. 둘다 쉽게 말해서 라이브러리를 땡겨오고 빌드까지 관리해주는 툴을 말한다

과거에는 Maven을 썼지만 요즘은 Gradle로 넘어왔기때문에 일단 이렇게 알아두면 됨

또 버전에 관해서 괄호하고 SNAPSHOT이라고 적혀있는거는 아직 만들고 있는 버전이라고 생각하면 된다  실험중인 버전이라고 생각하면 될듯-> 선택하면 안됨

Group에는 보통 도메인을 거꾸로 적는다

Artifact에는 프로젝트 명

중요한건 Dependencies에 각종 라이브러리를 추가할 수 있는데 나중가면 많은것을 추가하겠지만 일단 spring web, thymeleaf 를 추가했다. thymeleaf 같은 경우는 -> html 템플릿 엔진이라고 보면되는데 MVC 방식에서 이용되는 라이브러리 이다.

선택을 한 후 폴더를 보면 여러개가 있는데

main과 test가 나눠져 있다. main에 자바에는 실제파일들이 있다. (test가 요즘에 되게 중요하다고 한다.)

resources에는 java파일을 제외한 나머지 파일이 있다 ( 장고에서 템플릿관리하는것처럼 )

스프링을 이렇게 해서 생성하면 git.ignore도 딸려온다.. ( 장고 예전에 올릴때 큰 프로젝트는 아니었지만 이거떄문에 좀 시간이 소요됐었는데 스프링 생각보다 착한애 일수도..?)

또 최근 Intellij 버전은 Gradle을 통해서 실행하는게 기본 세팅이기 때문에, 실행 환경을 좀 변경하면 실행속도를 더 빠르게 할 수 있다. 아래 참고

또 내장 톰켓도 같이 존재함

그리고 내가 선택한 것은 spring web, thymeleaf를 가져왔는데 많은 라이브러리 들이 존재하는데, Gradle이나 Maven이 의존관계로 이뤄져있는 라이브러리들을 다 땡겨왔다고 할 수 있다.( 이친구들이 다 관리를 해준다)

라이브러리를 좀 나열해보자면

스프링 부트 라이브러리

spring-boot-starter-web s

    pring-boot-starter-tomcat: 톰캣 (웹서버)  

    spring-webmvc: 스프링 웹 MVC

spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)

spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅

    spring-boot

        spring-core

spring-boot-starter-logging

    logback, slf4j

 

테스트 라이브러리

spring-boot-starter-test
    junit:
테스트 프레임워크
    mockito: 목 라이브러리
    assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리

    spring-test: 스프링 통합 테스트 지원

 

또 spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다.

또한 스프링 부트에서는 스프링 생태계를 제공하고, static에 index.html을 만들면 이게 기본화경이 된다

 

이제 웹 개발에 대해서 얘기를 좀 하자면

웹 개발은 보통

정척컨텐츠

MVC & 템플릿 엔진

API 방식

 이렇게 3가지 방식이 있다 하나씩 살펴보자면

 

 1. 정적 컨텐츠

 

정적 컨텐츠

 

정적컨텐츠는 웹 프라우저에서 url을 보내면 맨 처음 스프링 컨테이너에서 해당 url관련 컨트롤러를 먼저확인하는데 없을경우 static에 url에 적힌 html파일이 있는지 확인 후 있으면 그 페이지를 그대로 보여주게 된다. 

 

 

2. MVC

MVC

 

MVC 방식은 Model, View, Controller (Django에서 MTV와 이름만 다른 것)3글자 약자로 저 Model,View,Controller를 이용해서 페이지를 가공해서 유저에게 보여주는 방식으로 컨트롤러가 모델에 값을 넣어서 viewResolver에게 전달하고 이 Resolversms HTML로 변환해서 값을 보낸다 (thymeleaf가 여기서 쓰임)

thymeleaf가 말이 나와서 추가로 설명 하나만 하자면 thymeleaf는 절대경로를 크롬창에 복붙하면 서버 없이 바로 화면 여는게 가능하다.

 

 

 

3. API

API

마지막으로 API방식은 뷰 리졸버를 이용하는 것이 아닌 웹 프라우저에게 Json 값을 전달하는 방식이다. 현재 제일 많이쓰이고 있다.(Django에서 DRF방식)

url이 넘어오면 컨트롤러에 @ResponseBody 어노테이션이 적혀있으면 HTTP에 BODY에 문자 내용을 직접 반환한다.

이때 viewResolver 대신 HttpMessageConverter가 동작한다.

문자 처리는 StringHttpMessageConverter가 처리하고 객체처리는 MappingJackson2HttpMessageConverter가 처리한다.

그 밖에 byte 처리 등  HttpMessageConverter에 여러 기능이 있다.

 

추가로 객체를 Json으로 바꿔주는 라이브러리가 유명한것이 2개 있는데 하나는 jackson과 Gson이 있다.

스프링은 기본적으로 jackson을 탑재되어있다.(그래서 위에 jackson2 라고 적혀있음)

Gson같은경우는 구글에서 만든 라이브러리다.

 

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    @GetMapping("hello")  // url 매핑인거같음
    public String hello(Model model) {
        model.addAttribute("data", "hello!!");
        return "hello"; // hello라는 파일을 찾아서 렌더링해라 라는 의미(templates 아래에 있는 hello를 찾음)
    }

    @GetMapping("hello-mvc")
    public String helloMVc(@RequestParam(name= "name", required = false) String name, Model model){
        model.addAttribute("name",name);
        return "hello-template";
    }

    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name; //"hello spring"
    }


    // 진짜 real
    // JSON 값을 보냄
    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;

    }

    static class Hello {  //static class를 이욯하면 class 내 클래스 사용 가능
        private String name;

        public String getName() {
            return name;
        }

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

컨트롤러 코드만 가져왔다. Django를 할줄 알아서 Django와 비교될 수 밖에 없는데 일단 django와 다르게 컨트롤러에 @GetMapping 어노테이션을 이용해서 url 매핑을 같은 파일에서 진행항다

또 객체를 반한할때 게터세터 방식을 이용한다 (다들 이렇게 부른다고 함)

728x90