상세 컨텐츠

본문 제목

71일 - 메이븐 vs 스프링 vs 스프링부트, @restController vs @Controller

수업 일지/Spring

by NayC 2021. 6. 1. 12:41

본문

728x90

오전에 프로젝트를 하나 만든 것

 

//

 

maven 역할 vs Sping 역할 vs Spring Boot의 역할 

1) maven 

- POM 파일 안에 

- 프로젝트에 소속된 오브젝트들을 관리하는 것

- maven이 일하도록 하는 지시사항

  프로젝트 골격은 이렇게 하고 ~ 

- <parent> 안에 프로젝트 골격 </parent> 

  src > main, tet ... 

- <properties> 플러그인들이, depecdency가 사용하는 전역변수같은. 

  안에 마음대로 이름 정의 가능 

  ex) <a>33</a> 

       <x>44</x> -> 이거를 클라이언트나 디펜던시가 가져다가 사용... 

- <build> 생명주기. 각 단계별로 사용되는 플러그인

  지금 우리 프로젝트에서는 플러그인 한 개가 들어가 있는 것

- <dependecies> 굉장히 중요.

  예전에 gson이라는걸 떠올리면... 

  이제는 jsp를 view단으로 기본적으로 처리하지 X + 톰캣의 향기가 나지 않음... 

- gson 다운 받으려면 : 공식 사이트 가서 다운받아야

  이제는 그럴 필요 x

  maven repository 검색하면 maven에서 프로젝트에서 사용할 라이브러리 다 가지는 곳

  아키텍처 타입, 라이브러리 다 가지고 있는 곳

  -> gson 검색하면 ... 예전에는 직접 jar 다운받아서 > lib에 직접 카피해서 두고 그랬는데 ... 

복사해서
붙여넣기만 하면! 저절로 라이브러리가 추가됨! 

이것때문에 maven 쓴다고 봐도 무방... 너무 편해짐!!! 

 

// gson은 예제로 가지고 온 것 (지금 예제에서는 필요 x)


Spring은? 

- maven 도움을 받아서 자기가 필요한 dependency를 통해 다운받게 하고 배포하게 하는 

- 스프링은 just 기본 틀을/라이브러리를 가져오는. 

- 스프링은 그냥 라이브러리!!! 

  @ 어노테이션 자체가 라이브러리임.

이렇게 @어노테이션 쓰려면 설정들을 해줘야하는데, Boot의 등장으로 그게 없어진 것! 

cf) 과거에는 xml 형태 or dispatcher(?). 

    Boot 쓰면 이걸 볼 경우 없을 것. 

- 이걸 더 알고 싶으면 과거를 알아야 하는건데 그건 유튜브를 볼 것

 

 

Spring Boot

-

이 안에 톰캣이 있다는 것.

그리고 디렉팅해서 찾아나설 수 있는 기능을 한다는게 핵심 @들

 

boot가 spring을 깨움 > 1) di 기능 2) transation 처리 3) mvc url 매핑 4) 타임리프 설정 

 

깨어나자마자 "url 매핑은 @ 해놨어. url 들어오면,  패키지 안을 다 뒤져봐. 있을거야. 

- 근데 패키지가 너무 많다면? 

  그거 찾는데 성능에 문제가 있을 것 같으면 설정하는법 있음

Q. 예전에는 8~11번째줄처럼 각 기능들마다 패키지, Controller를 만들어줬었는데, 왜 지금은 HomeController 하나만 만들까? 

-> 이제는 컨트롤러 만드는 방법도 달라진 것

 

Controller 

- 기존의 컨트롤러가 가진 문제점 : 서비스 하나만 매핑하는로 해왔음... 

기존 방식

-> 이제는 class가 대상이 아니라 함수가 대상이 되기 때문에, '진정으로 바람직한' 매핑이 이뤄진 것

그 전에는 함수에 매핑이 안되서 class마다 만들고... 한 함수만 매핑하고... 

모든 url을 HomeController에 다 매핑시킬 수 있는.

원하는대로 다 넣을 수 있는! 

 

Q. 

-> 이름 겹치는게 싫으면 Controller 폴더를 분리할 필요는 있겠지. 

 

규모가 작으면 굳이 나눌 필요는 없지만

 

//

함수명 앞에 나온게 class / 그 앞에 패키지

 

우선 @RestController로 

 

-> 컨플릭트 남 

 

class 이름 같으면 문제가 남 (DI 할 때 설명하도록 하겠다.)

-> 이름 같으면 안 됨

- '큰 컨테이너'에 담겨지는데 @Controller 붙은 얘들은

-> 이름이 같으면 (보따리에 소문자로 바뀌어서 'noticeController' 되는데) 컨플릭트남

 

bean 이름 = 객체 이름

(일반적으로는 objcet 이름이라고 해야하는데 bean 이름을 좋아한다고 ㅎㅎ)

- (커피)콩이 2개가 있는데 이름이 다 noticeController이니. 

 

6번째줄처럼 이렇게 이름을 바꿔줘야

- 위에랑(디폴트) 헷갈리지 않도록  

 

-> 그럼 정상적으로 실행됨 (url에 직접 쳐서 보면) 

// 컨트롤러를 만드는걸 했다. 

 

우리가 jsp 이용해야함

출력이 간단한건 상관이 없는데... 

-> /index 들어왔을 때의걸 만들어보자

 

help > 이클립스 market plae > 

 

web > other > html 문서 추가 가능

설정들 바꿔주기

 

이전에 했던 view 폴더를 그냥 통째로 가지고오기

 

list.jsp 이제 사용할 수 있게끔 하자.

 

index 가지고 있는 HomeController에서 이제 

-> @rest 지우고

 

1) return "index"가 사용자에게 그냥 갈 경우 @rest 

- 바로 출력을 의미

 

2) @rest 지우는거면, view 페이지명을 담게되는 것

- 포워딩을 의미 

Q. rest란? 

- 객체를 데이터로 표현하는... 

  

CSV

- 콤마로 구분된 value

- 이거의 단점은 '순서' 기반이라는 것

  순서를 바꾸면 값이 바뀔 수 있음

 

-> transfer는 객체 상태가 가는 것

    뭔가 전달법이 필요함

이런걸 data API 라고 함

 

요즘 핫한 표현방식은 바로 'JSON' 

무겁지 않은

// "객체 데이터를 전달하는 녀석으로서의 API = REST API"라고 함

- 문서 반환이 아니라 REST(객체 상태)를 반환하는거라면, @RestController는 상태를 반환하는거로 본다는 

 

세상이 요구하는 get 요청이 나누어져 있다보니 

-> html 출력을 Controller에서 하는 것은 올바르지 않다. 

    return "<html> ... 이런건 옳지 않음 

-> 뒤의 엔진들에게 일하라고 포워딩 해야함.

 

@restController  -> 그냥! 출력함

@Controller -> 실행하게 하도록 함

 

 

-> 이러고 url에 index를 호출하면

저~~절로 JSON 형태로 그대로 transfer 해줌. 

스프링의 어마어마한 걸 느껴보기

 

만약에 배열에 담았다면

-> 이번엔 배열로 반환을 해줌! 

 

요지는 요청 타입 2개인데 데이터는 중간에 api를 껴서

 

 

 

view, entity 폴더 복사해서 붙여넣는거 하기

- entity는 패키지도 만들어서! 

 


  src/main/recources > static 폴더에 html 파일 하나를 만들어보자. 

  이전에 만든 list.html을 복붙해서 가지고 옴

  서버 연결된 상태에서 url 주소 수정해서 /list.html 하면 나옴

  

  view 단 처리하는거 만들면 templates 아래 만듦 (타임리프 사용할 수 있는 공간!) 

  

  

-> aa.html 

      서버에서 url 수정해서 누르면 에러남

-> web-app 폴더 만들고 > WEB-INF 폴더 만들고 > 그 안에 aa.html 넣어야

 

서버 재시작

1. 기존의 html, css, js들 두는 곳

2. 타임리프

3 > view 폴더 만든 다음에

   서버코드 (jsp)

 

//

 

지금 templates 아래 빼고는 다 나오는게 맞음 (뭘 설정 안해줘서) 

- bb.html 은 view 밖에 webapp에 넣어주는 것 (클라이언트가 WEB-INF에는 접속을 못하니!!) 

이렇게 url에 직접 넣어보면서! 


제일 먼저 다뤄볼 것은... 타임리프! 

 

위에서 Controller에서 데이터 마련

-> 마련된 데이터를 view에서 포워딩해서 처리하게 함

 

 

 

 

 

 

 

 

728x90
반응형

관련글 더보기