ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링입문 - 환경설정 및 개발기초
    스프링/스프링부트+JPA - 블로그 2021. 8. 20. 19:55

    인프런 '김영한'님의 강의 참조!

     

     

    • 스프링은 엄청거대하기때문에 하나하나 모든것을 알 수 없다
    • 이 강의의 목적은 필수 개념 및 최신 트렌드에 중점을 둔다
    • 기술 그자체에 계속해서 파고드는것이아니라 어떻게 사용하고 오래되고 마이너한 기술은 과감히 버리고 실무 위주로 이루어진다

     

     

     

    - 프로젝트 환경설정

     

    1) 프로젝트 생성

    • 스프링부트 사이트를 통해서 프로젝트를 생성 (자바 툴을 통해서 만들어도 된다)
    • 예전에는 밑바닥부터 프로젝트 세팅을 했으나 요즘은 부트를통해 쉽게 생성이 가능

    이렇게 해서 임포트 후 작동이 안되면 직접 STS에서 만드는게 낫다

    1. Maven/Gradle Project
      필요한 버전 설정/라이브러리를 땡겨오고 직접 빌드까지해주는 툴. 과거는 메이븐 현재는 그래들로 함
    2. Dependency
      쓰고싶은 라이브러리들을 지정하는것(의존성)
      Spring Web - 웹프로젝트를 만드는데 도움을 주는 툴
      Tymeleaf - 뷰/웹 템플릿 엔진으로 마크업언어(HTML/CSS/JS)안쪽에 속성으로 쓰여지는 등의 이점으로 마크업 구조를 흐트리지않고 개발할 수 있다는 장점이 있다
    3. STS에서는 임포트 -> 그래들 -> 프로젝트선택 해서 싱크를 해줘야 한다
    • 가장중요한 'build.gradle' 

    만들기전에 세팅했던 값들이 그대로 그대를로 빌드가 되어있음!

     

    • 서버 테스트!

    톰캣 8080을 가르키고 있다!
    연결 성공!

    • 톰켓서버가 내장이 되어있는 스트링 부트! JSP, 스프링, 스프링 레거시 등에서 하는 불편함들이 이미 세팅이 되어있다

     

     

     

    2) 라이브러리 살펴보기

    • 라이브러리를 보게되면 내가 세팅을 하지않았는데도 엄청나게 많은것들이 들어와 있는데 그 이유는 의존성관계기반이기 때문이다
    • 예로 예전 개발자들은 톰켓을 직접깔고 포트부터 밑바닥까지 다 세팅을 했어야했는데 최근의 개발은 부트를 통해 미리 기존 세팅을 하게되면 알아서 내장톰켓이 세팅이되고 필요한 라이브러리들을 미리 땡겨와서 개발이 가능

    가장 기본적으로 부트로 개발시에 들어가는 라이브러리들

     

     

     

    3) View 환경 설정

    - Welcome Page 만들기

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

    • 이 프로세스는 정말 정적인 것. 웹서버가 적어논 파일을 가져가고 표출하는, 즉 프로그래밍이 아닌(?)것
    • 스프링부트 세팅상 static아래에 index.html이 웰컴페이지로 세팅이 된다

    - 동적으로 만들어보자! thymeleaf + controller의 이해

    @Controller
    public class HelloController {
    	@GetMapping("hello")
    	public String hello(Model model) {
    		model.addAttribute("data", "hello!!");
    		return "hello";
    	}
    }
    • 어노테이션을 통해 컨트롤러의 역할 배분과 URL의 ContextPath를 캐치하도록 설정
    • 스프링부트에서 제공하는 Model 객체를 통해 view에 뿌려지는 데이터를 넘겨 줄 수 있다. 
    • 'model.addAttribute'를 통해 데이터를 캐리하는 데이터 이름과 데이터 내용을 정하고 최종적으로 "hello" 탬플릿으로 그 데이터를 전송함
    *hello.html
    
    <!DOCTYPE HTML>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <title>Hello</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
    <p th:text="'Hi' + ${data}">Welcome!</p>
    </body>
    </html>

    템플릿에는 쓰기위한 데이터가 넘어오면 타임리프형식의 코드를 써서 데이터를 뿌릴 수 있음

    <p th:text="'Hi' + ${data}">Welcome!</p> = request.getAttribute와 같은 로직

     

     

     

     

     

     

     

     

    • 어떻게 동작되는지 자세히 보자

    1. 컨트롤러에서 GetMapping(URL주소와 같다고 보자)에 따라 페이지가 결정
    2. GetMapping에서 캐치한 URL주소에 정의된 함수로 이동
    3. Model 객체가 키와 밸류로 필요 데이터를 저장하고 리턴으로 문자를 반환하면 'viewResolver'가 문자에 지정된 탬플릿을 찾아 처리한다 (viewResolver의 기본 viewName매핑 기능 => resources:templates/'+{ViewName}+'.html'. 즉 resources:templates/'hello'.html' 을 찾음)

     

     

    - 스프링 웹 개발 기초

    • 스프링 웹 개발시에 가장 기초 개념은 정적컨텐츠기능/MVC+텀플릿엔진/API로 구분 된다.

    1) 정적컨텐츠기능

    • 만들어놓은 파일을 그대로 클라이언트에 던지는 것. 프로그래밍이 불가능한 컨텐츠. 
    • 위에서 언급한대로 static에서 처리 가능

    설명대로 만들어놓은것을 그냥 주고받기만 할 수 있음
    MVC 개념이 아니기때문에 부트에서 컨트롤러를 거치지않고 바로 static이하로 가서 맞는 파일을 찾아서 클라이언트에 뿌려줌

     

     

     

    2)MVC와 템플릿 엔진

    • M(Model)V(View)C(Controller)라고 불리는 개발의 가장 기초적인 개념이다. 
    • Model은 데이터를 담거나 넘겨주는 역할, Controller는 비지니스로직(코드), 뒷단처리등을 처리, View 화면을 그리는데에만 집중
    *Controller
    	@GetMapping("hello-mvc")
    	public String helloMvc(@RequestParam("name") String name, Model model) {
    		model.addAttribute("name", name);
    		return "hello-template";
    	}
        
        
    *hello-template.html
    <body>
    <p th:text="'hello'+${name}">hello! empty</p>
    </body>

    param을 채워야 작동이 된다!

    • 앞에서 간단하게봤던 동적개념과 같다고 보면 된다. 작은 차이점은 MVC모델에서는 파라미터를 받아와서 모델에 저장 후 뿌릴 수 있다는 것.
    • 컨트롤러 -> 모델 -> 뷰 의 프로세스를 기억하자!

     

    3) API

    • API(Application Programming Interface)의 약자로 응용프로그램에서 사용할 수 있도록 운영체제나 프로그래밍언어가 제공하는 기능을 제어가능하도록 만든 인터페이스를 뜻한다. 

    • API는 크게 3가지의 역할을 한다
    1. 서버와 데이터베이스에 대한 출입구 역할 (허용된 사람들만 접근성 부여)
    2. 애플리케이션과 기기가 원할하게 통신하는 역할(프로그램과 서버)
    3. 모든 접속을 표준화하는 역할(모든 접속을 표준화 하기 때문에 기계/운영체제 상관없이 누구나 엑세스 가능)
    • 김영한님의 조언: 정적컨텐츠를 제외하면 두가지만 기억하자 
      1) HTML로 뿌리냐
      2) API로 데이터를 뿌리냐
    *Controller
    	@GetMapping("hello-string")
    	@ResponseBody //-> HTTP 응답 바디 부분에 내가 데이터를 직접 넣겠다 라는 뜻
    	public String helloString(@RequestParam("name") String name) {
    		return "hello " + name;
    	}

    • 뷰를 담당하는 템플릿을 탈 필요도없이 원하는 데이터 값을 뿌릴 수 있다. 
    • 또한 페이지 검사를 해봐도 HTML이 전혀 없는 것을 볼 수 있다.

    - 또 하나의 예제를 보자

    static class Hello {
    	private String name;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    
    
    *Controller
    	@GetMapping("hello-api")
    	@ResponseBody
    	public Hello helloApi(@RequestParam("name") String name) {
    		Hello hello = new Hello();
    		hello.setName(name);
    		return hello;
    	}

    • JSON형태로 나오는 것을 볼 수 있다

    • @ResponseBody가 있으면 HttpMessageConvert가 작동을 하면서 HTTP BODY의 문자내용이 기본 문자이면 String, 객체형태이면 Json 컨버터로 처리가 되어지고 화면에 뿌려지는 것
    • 웹 개발에서의 API는 객체를 반환할때 도와주는 역할 (뷰없이 데이터를 JSON형태로 바꿔 바디에 넣어 주는 것)

     

    다시 상기하자. 웹 개발은 3가지로 이루어진다 1)정적컨텐츠의 기능 2)MVC/템플릿엔진 3)API

     

     

     

     

Designed by Tistory.