본문 바로가기
코딩

2022.03.16_26일차_스프링(1)

by 흥뷰자 2022. 3. 16.

26일차 학습내용

1. 스프링 설치하고 STS 개발환경 설정 후 프로젝트 하나 만들어보기
     설치
     압축해제
     실행하여 경로설정
     Spring개발환경으로 변경
     인코딩 변경
     서버세팅
     메이븐MVC모델 프로젝트생성(레거시)하고 서버세팅 마저
     
2. 메이븐으로 만든 프로젝트 폴더 구조

3. 설정파일 

 

 

1. 스프링 설치

구글에 spring을 검색. 바로 들어가는 링크 https://spring.io/tools

상단 메뉴바에서 Projects 중에 Spring Tools4 를 선택 

자신 윈도우 환경에 맞는 버전을 다운

MVC 웹 프레임워크 - 웹 프로그래밍 기반 우리가 사용할 것. (기타 Spring AOP(관점지향프로그래밍) Spring Boot도 있지만 처음에 공부로는 라이브러리가 뭐가 들어가는지 알수 없음)

STS 4 plugin 설치 (개발환경 툴 세팅방법은 여러가지_Eclipse기반 STS/ Intellij(유료)_ 인데 우리가 서용할 방식은 Eclips + 플러그인)

프로젝틀 생성할 때 라이브러리를 관리하는 방법에는 lib에 다운받아 넣을지/ Maven방식으로 쓸지/ Gradle방식이 있는데 우리는 Maven방식으로.

 

스프링 버전 5.0 오점대

Boot인지 MVC인지 

라이브러리 관련해서는 Maven방식인 Gradle방식인지 체크


2. 다운받은 스프링 툴 압축해제하고 실행 

 

이클립스 기반의 STS  (IDE 개발환경 툴 중 하나가 STS)

STS 다운로드 받은 거 폴더 내부에 이동시켜서 더블클릭 (jar도 압축형태)

폴더 내부에 .exe가 설치 완료된 모습. 실행!

 


3. 프로그램을 실행해서 열리는 화면에서 경로설정 _ 자신의 워크스페이스 경로로 잡아줌


4. 마켓플레이스에서 sts3 설치 > 툴 재부팅 > Spring개발환경으로 선택~

메이븐 방식으로 하려면 버전이바뀌어서 따로 설치 필요 (우측 상단 +표시 누르면 Spring이 안보임)

 

sts를 검색해서 Spring Tools 3 어쩌구 다운

기본 체크된 상태에서 Confirm

agree 로 바꾸고 finish

밑에 프로그래스 바가 다 끝나면 

Restart Now! 클릭

재부팅되면 우측 상단 +표시에 Spring이 생긴걸 볼수있음

해당 아이콘을 클릭하면 스프링 개발모드로 변경됨


5. encoding 인코딩 변경 (UTF-8)로 변경

 


 

6. 서버세팅- 톰캣으로. 깔린 버전 정보 맞춰주고 브라우즈 해서 하위 폴더까지 들어가지 않은 상태로 톰캣까지만

 

 

 

톰캣이 서버로 장착된 거 확인 가능

마저 서버세팅 (프로젝트 만든 다음에 가능)

 

 

(옵션) 버퍼 크기 조절 window-preference


좌측에 Run/Debug > Console 에서 
Limit console output - buffer size를 더 키움 (100000으로) -> Apply and Close

서버 톰캣을 재생버튼 눌러서 실행

방화벽 허용

 


7.  프로젝트 만들고(라이브러리 버전 수정 없이) - 서버세팅 마저 

 

File > New > Spring Legacy Project 

이거로 선택하면 메이븐방식의 MVC패턴으로 개발할 수 있게 프로젝트 세팅됨

 

Project name은 마음대로하고, Spring MVC Project 선택 > next! > 패키지명 3단계로 작성 > finish!

 



! -- 잠깐 -- !
next 누를 때 다음과 같은 에러가 발생한다면 프로젝트 생성 취소 후 경로설정을 해주러 ㄱㄱ

 
 


에러가 발생하면 대부분 구글링에서 해결법이 나옴
프로그램 닫고 ini파일을 수정하러 ㄱㄱ javaw.exe 경로만 추가해줘야함 이상한걸 잡고있어서 그런 것이라.
아까 SpringTollSuite4.exe파일 아래 .ini 파일을 메모장이나 VisualStudioCode에서 열어서 


java 파일 내부에 javaw.exe의 위치를 찾아서 경로를 복사한걸 


적절한 위치에
-vm
C:\Program Files\....
붙여넣기를 한다. (붙여넣기는 에러 생길 수 있으니

그대로 아래에 직접 타이핑해서 적고 위에 복붙한건 삭제. 그래도 안되면 VSCode로 작성)



 
 

재실행하니까 됨

패키징 네임 룰 웹사이트 도메인을 거꾸로 씀. com.naver.~ //3단계 작성

설치 지금 필요없으니까 이건 안하고 패스 (응 설치해야했네 결과적으로)

폴더 만들어진거 열지마. 돈터치. 내리지 말것. 우측 하단 보면 프로그래스 바가 설치중이라.

아직은 뉴파일 하나 한것....

설치가 다 완료 되면 열어봐

 

설정파일들도 다 만들어져있고

마저 서버세팅 (프로젝트 만든 다음에 가능)

프로젝트 우클릭 > Properties > Java Build Path > Libraries > Classpath 선택 해서 > 우측에 Add Library ...

열리는 창에서 Server Runtime > Next > 톰캣 선택하고 finish 하면

Server가 세팅완료된다잉~ 적용하고 창닫기

 

업데이트 프로젝트

서버 세팅은 프로젝트가 있어야 끝나유

서버 우클릭 > Add and Remove > configured로 프로젝트이동

서버로 해당 프로젝트를 올려주는 것

 

 

 

프로젝트 우클릭 Run As > Run on Server

 

 Run on Server가 안보이면 깔아야 할 것이 두개가 있음


이거 두개 깔면 Run on Server가 나타남 

런온서버

톰캣을 선택해서 finish

브라우저를 통해서 hello world가 찍히게 된다. (알아서 미리 샘플파일을 만들어놨기 때문에 가능)

문자열과 Date객체가 찍혀있다. 

주소는 /controller/ 

 

서버 주소를 바꾸고 싶으면 서버 더블클릭 - Modules 에서 path를 바꿔주면 됨.

이렇게 페이지가 자동으로 hello world가 뜨는 이유는 샘플파일을 자동으로 만들어줘서 (HomeController.java)

컨트롤러가 어떤 화면을 보여줄지 지시. 

 

Date객체생성해서, model을 통해 "serverTime"이라고 이름붙여서, formattedDate 형식으로 jsp페이지로 전달~

화면에 보이는 페이지는 위에서 리턴 된 home.jsp

${} 표현언어 el.(다음다음 시간에~)  앞에 문자들과 함께 Date객체가 찍히게 됨

STS 끝. 이거로 개발할 게 아니라 한번 해보고 이거로 끝.

 

 

앞으로 공부할거 

MVC패턴

el

jstl

폴더구조


! -- 이것저것 추가설정 만져봄 -- !

다 끄고 프로젝트 맨 하단에 prom.xml 실행해서 자바버전(11로)과 소스 타겟(5.1.5로) 태그 값을 변경해준다. 


업데이트해서 리스타트.





 

 


 

 

스프링 개발환경 설정

 

이제 Spring 폴더 내에 eclipse 압축을 다시 해제함 // 이클립스 버전은 구버전으로 해야 sts3 호환되서 그거로 설치

sts3는 지금 서비스 지원이 안되고 있고 eclipse는 업데이트가 되고 있으니까 호환이 안되니까~~

 

실행해서 STS3 플러그인 추가

 

재부팅하면 Spring이 뜬다.

그럼 + Spring 개발환경 선택

서버세팅 - 톰캣서버세팅

 


프로젝트 만들기2 (이번에도 STS로.. ) 

이제는 pom.xml 열어서 버전들 바꾸는것도 해보고~

어제는 dynamic web project로 만든다음 이걸 메이븐으로 컨버트하면 스프링처럼 쓸수있어, 라이브러리도 때려박으면되고. 근데 그렇게 하면 폴더 구조가 많이 달라짐 

1. File > New > Spring Legacy Project

레거시로 프로젝트 생성하면 MVC패턴에 맞게끔 샘플 파일들이 세팅됨. 

 

2. pom.xml 내부 버전 java-version / springframework-version / configuration source target수정

프로젝트 우클릭 > Maven > Update Project 하고

프로젝트 우클릭 > Properites > Libraries > Add Library > Server Runtime > next > 톰캣 finish!

프로젝트 우클릭 > 메이븐 > Update Project

서버에 프로젝트 올리기 서버 우클릭 > Add and Remove > configured 로 이동 후 finish!

프로젝트 관련 세팅할것들 pom.xml을 설정을 몇개 바꿀거야~~~

메이븐방식으로 라이브러리 관리하는 프로젝트 =  파일에 pom.xml이 있는경우

pom.xml : 라이브러리들을 관리. 라이브러리 추가도 여기에 ~ 

더 필요한 라이브러리들은 내일 추가해볼것.

 

 


버전 정보를 써놓으면 다 바뀜
내 라이브러리 조정 추가 or 오프라인으로 스프링 쓰려고 하는 경우 = 메이븐 못쓰는 경우 사이트에서 jar파일로 다운받 아서 lib 폴더에 넣든지. 그 폴더가 보이지 않으면 프로젝트의 마우스 오른쪽 > properies > Java Build Path > Libraries > Add JARs... or Add External JARs... 
(lib폴더는 jsp 다이나믹 웹 프로젝트 할때 자동생성 / 대신 이때는 pom.xml에 dependencies태그에 dependency 다 추가해야) . STS는 폴더구조가 달라서 없는것  
아래 사이트에서 spring검색
https://mvnrepository.com/
5.1.5 많이쓰고 안정적

<dependency></dependency>태그 하나가 라이브러리 하나씩인 것.
필요한것 더 추가하면 Maven Depedencies에 자동으로 추가가 됨


스프링 레거시 프로젝트로 생성하면 dependency에 기본적인 라이브러리들이 이미 들어와있는 상태

mvnrepository.com
우리 프로젝트는 메이븐 방식으로 라이브러리를 관리하게 


다운받은거 찾아서 추가하면됨
lib폴더가 sts는 구조가 달라서 없으니까 직접 
jsp쓸 때는 dynamic web project 하나 만들면 폴더구조가 비슷하긴 한데
프로젝트  우클릭 -configur - create new POM 하면 Maven방식으로 바뀌면서 pom.xml 만들어짐 스프링으로도 개발 가능.
1페이지에 있는거 다 추가추가 해주면 됨
 

 

 

 

<java-version> 11로 바꾸고

<org.springframework-version> 5.1.5.RELEASE 로 바꾸고~~

 

 

프로젝트 우클릭 > Maven > Update Project (Alt + F5)

 

서버에 프로젝트 올려줘야. 서버 우클릭 > Add and Remove > configured로 옮겨줌

 

 

 

 

 

직접 라이브러리를 추가할 때는 프로젝트 우클릭 > properties > build path > library 톰캣 잡혔나 확인

 

 

 

이제 메이븐 폴더 위에 Server가 잡힌 게 확인됨

자체내장브라우저.. 이렇게 여기서 실행 안하고 앞으로 

지정한 주소로 브라우저에서 띄울것. 주소 경로도 직접 지정할거고 jsp로 안하고 (jsp는 요청을 view로 넣는것, views도 WEB_INF 안에 있는 것. 이 안에 있는건 브라우저에서 주소를 찾아갈수가없음 숨어있어서 . jsp도 그 안에 넣어놀거야)

이젠 요청이 컨트롤러로 가야하기 때문에

 

 


폴더 구조에 대해 ...

개발구조 중 하나인 MVC 패턴  역할담당 분리~~~~ 

M : Model : 뷰와 컨트롤러를 제외한 모든 클래스 객체들, 빈 지칭 (DAO, Service, DTO, ... )

V : View : jsp

C : Controller : 내부는servlet(스프링에서는 java controller라는 java파일로 서블릿생성되게 함)  

 

 

스프링에서의 구조는 약간 달라짐

요청이 들어오면 컨트롤러 역할하는 게 DispatcherServlet. 

요청 들어온거에 맞는(핸들러매핑) 우리가 제작한 Controller따로 있는데 그걸 찾아줌 (java 파일) - 그게 모델을 부름 서비스 메서드 통해 DB갈일 있으면 갔따오고 

요청결과 ViewResolver가 view.jsp파일 찾아서 데이터 얹어서 응답해줌

 

디스패쳐서블릿 내부 구조 (메이븐 으로 만들면 자동으로 구조 만들어줌)

 


프로젝트 폴더 구조

/ 초록색 부분이 우리가 작성할 부분들 

어디에 뭘 작성해넣어야하나~~

 

메인 자바 클래스 컨트롤러~ 모델~~~
메인 소스(설정파일 등)   
테스트 코드 패키지  
테스트 소스  
경로상없고 이클립스에서만 존재  
경로상없고 이클립스에서만 존재  
경로상없고 이클립스에서만 존재  
js, css, 이미지들 WEB-INF 외부~~  
   
자바 컴파일된 소스폴더라 (우리가 쓸필요 없음)
설정파일 저장 폴더   
   
3.설정. 서블릿(웹.요청)관련만 접근. n개 빈즈~~ 컨트롤러,뷰리졸버,핸들러매핑
2.설정. 스프링 루트 (전체가 접근) 1개 서비스나 DB관련, 부모
jsp파일 위치 뷰~~~
   
   
1.설정. 전체프로젝트 기본   
Maven방식으로 라이브러리 관리  

 

* TDD 테스트주도개발 : 테스트 해서 최소다위 코드들 테스트해서 성공한것만 프로젝트에 올려~~

실제 돌아갈 때는 올라가지 않는 애들

 


설정파일

테스트해서 성공한것만 프로젝트에 올려~~

실제 돌아갈 때는 올라가지 않는 애들

 

 

 

web.xml (설정파일)의 구조

설정정보 담겨있는 파일. (이미 세팅되어있음). 소스코드랑 다른 것. 

설정으로 뺀다. = xml파일로 따로 넣다.

= (소스)코드(.java) 수정 없이 <인터페이스 구현 객체 ㅡ 인터페이스 사용객체> 사이 관계 (결합상태)

를 바꾸기 위한 코드 수정을 쉽게 하기 위함. 부품 갈기

A a = new A();

B b = new B();

C c = new C():

셋다 인터페이스 X를 구현한 객체

B를 C로 교체하고 싶다면 해당 소스를 직접 고치지 않고

X x = ?;로 세팅하고 뒷부분을 외부에서 읽어오고 채우자~~

 

설정파일의 패키지 명을 외부파일에 기억시켜놓고 . 객체이름 붙여 

day26.ex.인터페이스.B

 

String className = scan.nextLine(); 읽어오려는 부분. 수정할 부분

Class clazz=Class.forName("day26.ex.인터페이스.B"); //// 해당 클래스 정보. 클래스정보파일을 변수에 담아서

//////////////String.class 클래스명을 통해 클래스 정보, 이를 통해서도 무자열 객체를 만들 수 있음. 

//////////// a.getClass 인스턴스 같은거. 

Class clazz=Class.forName("className"); //위에거를 이렇게 바꿔야 

A a = new A(); /// 인스턴스를 만드는 방법

X x = (X) clazz.newInstance();    throws예외처리는 알아서.... 하게 던져버리고 ///인스턴스 만드는 다른 방법. 그 클래스를 이용해서 newInstnace()메서드로 새로운 인스턴스 만들어

a.setX(x);

 

A.class.newInstance(); 방식으로 하는 것

 

외부파일 내용을 C로 바꿔보면

day26.ex.인터페이스.C

 

 

 

 
컨텍스트파람 컨텍스트컨피그-루트컨텍스트.xml위치 어디~ 
기본설정관련. 프로젝트 관련된 것.
루트 관련된 설정xml역시 추가 가능<param-value> 태그 안에  (코드가 너무 길어지면 스캔오래걸리니까)
 
스프링서블릿뭐쓸거야~ 클래스로 - 디스패쳐서블릿으로 지정해놈 (스프링의 컨트롤러)
서블릿 컨텍스트컨피그- 설정정보파일의 위치 어디다~~ 서블릿컨텍스트.xml
하부에 디스패쳐서블릿과 그와 연관된 웹 스프링MVC 관련된 설정 여기에. MVC관련 설정파일 (xml) 추가시 어디에 추가할지 경로가 나와있지 (여기서는 appServlet>여기에~~)
url패턴의 주소로 요청이 오면 주소 패턴 지정. 서블릿 네임이 어떤 애로 처리를 하겠다~~ 
서블릿의 전체 경로 패턴을 지정

web.xml (설정파일)을 서블릿 컨테이너가 읽어서 이 요청에 어떤 서블릿 필요한지 보고 

해당 서블릿 인스턴스가 컨테이너에 있는지 확인하고 있으면 그거 호출(사용), 없으면 새로 생성(서블릿 init메서드호출)

서블릿 컨테이너에 스레드를 생성하고

미리만든 httpServletRequest, HttpServletResponse객체를 인자로 서비스를 호출. 

해당 서비스를 호출해면 그 안에 있는 로직이 수행되고 

이후 response, request 객체 소멸시키고 끝남

서블릿은 생성만 하고 소멸시키지 않음 . (서블릿이 싱글톤으로 관리되기 때문)

같은 요청이 들어오면 해당 서블릿이 호출(사용)되지.

서블릿 컨테이너는 서블릿 생명주기(생성,호출,소멸)를 관리하는 객체

한 요청 사용중에 다른 요청 또 들어오면 멀티스레드로 처리. 스레드당 다른 서블릿으로 처리하거나(멀티스레드) / 여러 스레드에서 한 서블릿의 여러요청을 처리하기도

 

멀티스레드는 큰 비용드는거라 다른 스레드로 전환하는 context switch가 많은 오버로드야기..

so 스레드 생성 제한두고 요청 처리마다 스레드 생성하게 되면 서버의 하드웨어 과부하로 다운될수도

 

 

Spring MVC 프론트컨트롤러 패턴 

모든 요청 받는 전면 컨트롤러 - 서블릿 - 디스패쳐서블릿

요청마다 서블릿을 두지 않고/ 서블릿을 하나만 정의해두고/ 

요청마다 매번 스레드를 생성하지 않고/   하나의 서블릿이 모든 요청을 수행

 

디스패쳐 서블릿이 어떻게 웹 요청을 처리하나

웹은 많은 클라이언트의 요청을 받아야하는 공간이니까

요청을 받아서 필요한 데이터를 가져오고(Handler Mapping)

/ 실행 메서드를 호출하고(Handler Adapter)

/ 화면으로 출력해주는 역할(View Resolver)을 세분화해서 시킴

 

Handler Mapper : Request받아서 Controller 찾아서 반환

Handler Adapter : Request받아서 해당 컨트롤러의 메서드를 호출해서 처리 로직 수행 후, 처리 결과 ModelAndView객체로 변환해서 돌려줌

View Resolver : View Name에 해당하는 jsp를  찾아서 View돌려줘. 디스패쳐 서블릿이 뷰파일을 찾기도 하지만 직접 생성하기도. 돌려받은 view에 모델로 들어온 데이터를 넣어서 응답결과를 생성을 요청해서 jsp나 thymeleaf같은 데이터 담은 출력파일로 응답

 

다들 인터페이스와 구현체들로 구성됨 . 디스페처 서블릿이 스프링 컨테이너로부터 주입받아 사용하고 동작.(스프링)

각 메서드 처리 핸들러만 개발자가 신경쓰면됨. 

 

 

 

 

 

'코딩' 카테고리의 다른 글

2022.03.18_28일차_스프링(3)  (0) 2022.03.18
2022.03.17_27일차_스프링(2)  (0) 2022.03.17
25일차  (0) 2022.03.16
2022.03.14_24일차_jsp(2)  (0) 2022.03.16
2022.03.11_23일차_jsp(1)  (0) 2022.03.16

댓글