dev/백엔드

gdg on campus ewha - Spring 1주차 WIL

wosrn 2024. 9. 17. 16:01

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 | 김영한 - 인프

김영한 | 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확

www.inflearn.com

 
 

WIL 
- 9/14 파트세션 
- 김영한 스프링 입문강의 1~4강

 

1) 김영한 스프링 입문강의 1강 : 스프링 스타터로 프로젝트 생성

- gradle , java, 스프링부트 버전은 정식버전 중 가장 좋은 3.3.3 선택
- group엔 기업명같은거 적음
- 템플릿엔진은 thymeleaf선택
- 옵션 선택 후 generate하고, 인텔리제이에서 이 프로젝트를 다운받은 경로를 찾아서 open as a project로 열면된다
 

 
프로젝트를 열면 대략 이런 폴더구조가 있다
idea는 인텔리제이가 쓰는 설정파일, gradle관련 파일, src- main,test 가 있는 구조이다
main이랑 test를 기본적으로 나누어준다
test는 테스트코드들과 관련된 소스들이 들어간다 -> 테스트코드라는게 중요하단 뜻
main은 다시 java, resources로 나뉨 - 자바 코드파일 제외한 xml,설정파일,html 등등이 들어감
build.gradle : 설정파일 - 예전엔 이걸 일일이 쳤지만, 요즘은 스프링스타터가 해줌
 

build.gradle

그리고 이어진 버전과의 전쟁... ^^
강의가 작년 강의이다보니.. 자바11 쓰시길래 굳이 11 또 깔아서 한건데
아마 스프링부트 버전이 달라서.. 내가 쓰는 스프링부트 버전은 17 이상이어야 한단다
그래서 바꾼 환경변수도 다시 싹 다 갈고., 프로젝트 설정도 싹 다 갈고.... 난리부르스
다음엔 스프링부트 버전을 더 낮은걸로 깔던지 해야겠다
 

아무튼 run에 성공하면 이런 메세지가 뜬다
보면 tomcat 8080 -> 8080포트로 열린걸 확인 가능하다

localhost에서 8080을 열어보면 이렇게 뜨는데, 이러면 성공한것이다 
아직 아무것도 입력한게 없으니 이렇게 뜨는것이고, 스프링프로젝트 run을 중단하고 8080에 접속하면 아예 사이트에 접속할 수 없다고 뜬다 (밑의 사진처럼)

 
그리고 마주친 또다른 문제... 프로젝트 run은 되는데 stop을 하면 에러메세지가 났다
구글링을 하다가 
https://velog.io/@kmh9250/Spring-Boot-Spring-Boot-%EC%8B%A4%ED%96%89-%ED%9B%84-%EC%84%9C%EB%B2%84-%EC%A0%95%EC%A7%80-%EC%8B%9C-Build-cancelled-while-executing-task-WeatherApplication.main-%EC%97%90%EB%9F%AC

 

[Spring Boot] Spring Boot 실행 후 서버 정지 시 Build cancelled while executing task ':WeatherApplication.main()' 에러

에러 페이지 스프링 부트로 실행했다가 다시 정지했을 때 위와 같은 message가 뜨면서 exception이 발생 이와 같은 문제는 code에 문제가 있는 것이 아니라 환경문제라고 볼 수 있다. 이러한 error는 grad

velog.io

이런 포스팅을 발견해서 따라하니 해결됐다 !
근데 설정문제나 환경변수 문제 해결하는거... 은근히재밋다
여전히 저게 gradle이면 왜 문제가 생길 수 있고, 저걸 인텔리제이로 바꾸면 왜 해결되는건지는 궁금하다
 
해결하고 나니 강의에서도 이걸 언급하신다
gradle을 안통하고 intellij로 실행하면, 속도도 더 빠르다고 한다
 
 

2) 김영한 스프링 입문강의 2강 : 라이브러리 살펴보기

 

스프링 프로젝트 구조의 external libraris 를 보면, 무수히 많은 라이브러리들이 알아서 포함되어있다
gradle같은 빌드 툴들이, 의존관계를 관리해준다
즉 스프링부트 스타터 웹 (우리가 플젝 생성 시 포함한 라이브러리)이라는 라이브러리를 땡기면, 이 라이브러리가 필요로하는 다른 라이브러리들을 자동으로 가져와준다
 

인텔리제이 우측 바에서 gradle 아이콘을 클릭해보면, depencies에서 라이브러리 간의 의존관계를 볼 수 있다
우리가 프로젝트를 만들 때 명시적으로 선택한건 스프링부트 스타터 웹 / 타임리프뿐이지만 그 둘의 왼쪽에 있는 버튼을 눌러보면 이 라이브러리들과 연관된 많은 라이브러리들이 나온다
이 중 tomcat이 아까 본 8080포트에 띄워주는 웹서버 관련 라이브러리이다
예전엔 이런 웹서버도 직접 설치해야했지만, 요즘은 스프링과 같은 라이브러리에서 웹서버를 내장하고있다(임베디드)
-> 자바 메인메소드만 실행하는데도 웹서버가 8080에 올라간다
 

스프링부트 스타터 라이브러리

 
로그와 관련하여 : 현업에선 system.out.println 을 쓰지 않고 로그를 통해 출력을 해야함

로그와 관련된 라이브러리
로그백과 slf4j의 조합을 많이 사용하기에, 스프링에서도 이 라이브러리를 자동으로 땡겨준다
 

테스트 관련 라이브러리들

핵심 라이브러리를 정리해보자면,
1.  스프링부트 라이브러리
- spring-boot-starter-web -> spring-boot-starter-tomcat (웹서버) , spring-webmvc 
- spring-boot-starter-thymeleaf(타임리프 템플릿엔진)
- spring-boot-starter(공통) : 스프링부트+스프링코어+로깅(logback,slf4j)
 
2. 테스트 라이브러리
- spring-boot-starter-test
-> junit : 테스트 프레임워크 (핵심)
-> mockito : 목 라이브러리
-> assertj : 테스트 코드 작성을 좀 더 편하게 도와줌
-> spring-test : 스프링 통합 테스트 지원
 
 
 

3) 김영한 스프링 입문강의 3강 : view 환경설정

지난 시간에 본 에러페이지 대신, 이제 뭔가를 띄워보자

index.html을 만들어준다
만들고 기본 코드를 작성하면, 


이제 8080 포트 접속 시 이렇게 뜬다
 
 
웰컴페이지와 관련해서, spring.io에서 관련 문서를 찾을 수 있다
https://docs.spring.io/spring-boot/reference/web/reactive.html#web.reactive.webflux.welcome-page

 

Reactive Web Applications :: Spring Boot

Spring Boot includes support for the following embedded reactive web servers: Reactor Netty, Tomcat, Jetty, and Undertow. Most developers use the appropriate starter to obtain a fully configured instance. By default, the embedded server listens for HTTP re

docs.spring.io

 

 
설명을 읽어보면 , static location에서 index.html을 찾는 식으로 웰컴페이지 기능이 동작한다고 쓰여있다
방금 이 페이지는 앞서 말했듯 정적 페이지이다
이제 템플릿 엔진을 쓰면, 원하는대로 모양을 바꿀 수 있다
우리는 타임리프라는 템플릿 엔진을 쓸것이다
https://www.thymeleaf.org/

 

Thymeleaf

Integrations galore Eclipse, IntelliJ IDEA, Spring, Play, even the up-and-coming Model-View-Controller API for Java EE 8. Write Thymeleaf in your favourite tools, using your favourite web-development framework. Check out our Ecosystem to see more integrati

www.thymeleaf.org

 

'

스프링 사이트에서도 위와같은 템플릿 엔진을 지원한다고 적혀있다
 

 
컨트롤러 폴더를 추가해서 위와 같이 파일을 만들고
 
resources의 templates에 hello.html을 추가해서

 
이렇게 입력해주고 나서 localhost의 hello로 진입하면 아래와 같이 화면이 뜬다

 
위의 동작에 대해 설명하자면,
- 웹브라우저의 localhost에서 hello 주소를 던지면
- 스프링부트는 톰캣이 내장되어있음 : 이 내장된 톰캣서버가 이걸 받아서 스프링에게 던져줌
- 스프링에선 hellocontroller의 @GetMapping("hello")를 보고, hello url로 매핑을 시킴
- 그럼 @getmapping 밑의 메소드가 실행됨 - 모델의 키는 data, 값은 hello!!, 리턴은 hello
-이 리턴의 hello와 이름이 같은 hello.html을 찾아서(resources-templates 경로에 있는), 이걸 렌더링함
(위와 같이 동작하도록 스프링에서 세팅을 해둔것)
- 컨트롤러에서 리턴값으로 문자를 반환하면 (위의 예시에선 hello), 뷰 리졸버(viewResolver)가 화면을 찾아서 처리함 -> 스프링 부트 템플릿엔진 기본 viewName 매핑: resources:templates/(viewName).html
- 이렇게 찾아들어간 html 파일에서의  p태그 안의 data는 아까 컨트롤러 코드에서 model에서의 키값(hello!!)이 됨
 
지금까지 정적 파일 동작과 템플릿 엔진을 알아보았다

 

 

4) 김영한 스프링 입문강의 4강 :빌드하고 실행하기

인텔리제이가 아닌 터미널에서 build 후 실행하는 방법

1. cmd에서 열고자 하는 스프링 프로젝트 경로로 이동

2. 해당 경로에서 gradlew 을 통해 빌드

3. cd build/libs 에서 dir 해보면 빌드된 파일들이 보인다

4. java -jar 파일명(~스냅샷.jar) 를 입력하면 실행된다

-> 만약 인텔리제이에서는 잘 실행되던 화면이 cmd에선 안되고 화이트라벨로 나온다면 

=> 스프링 프로젝트 경로에서 gradlew clean build 하고 다시 4를 하면 잘 된다

5) 스프링 세션 시간 내용

스프링 프레임워크 -> 프레임워크란 ? 웹 개발을 위한 뼈대 / 생산성 향상을 위한 도구

- 프레임워크 vs 라이브러리 : 프레임워크는 제어 역전(IoC)으로, 전체적인 흐름을 프레임워크가 제어하기에 개발자는 프레임워크가 요구하는 규칙에 따라 구현 (구조를 프레임워크가 제공) / 반면 라이브러리는 개발자가 필요한 기능을 직접 호출하여 사용하는 도구로, 코드의 흐름을 개발자가 직접 제어한다 (라이브러리는 구조 제공이 아닌 단일 기능 제공)

- spring : 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크

- pojo : 특정 규약에 종속되지 않음 (자바, 꼭 필요한 api 외에는 특정 클래스에 종속되지 않아야함) / 특정 환경에 종속되지 않는다

- spring 삼각형

-> AOP : 관심사의 분리를 통해, 횡단 관심사를 모듈화 할 수 있는 프로그래밍 패러다임 - 로깅,트랜잭션 관리와 같은 공통 기능을 핵심 비즈니스 로직과 분리

-> PSA : 특정 기술이나 플랫폼에 종속되지 않도록 하는 추상화 계층 제공 -> 이를 통해 개발자는 로직을 기술적 세부사항과 분리하여 다양한 환경에서 재사용 가능하게 설계

-> IoC/DI : DI를 통해 객체 간 의존성 주입 -> 개발자가 직접 의존성을 관리할 필요 없이 필요한 객체를 프레임워크가 제공

 

- IoC/DI 

-> 의존성 : 객체가 자신의 기능을 수행하기 위해 필요로 하는 다른 객체

EX) new Car() ; -> Car 생성자에서 new Tire(); -> 의존성을 단순하게 정의하면, new로 표현된다. car가 tire에 의존한다 (자동차를 생성하면, 자동차는 내부적으로 타이어 생성)

-> 의존성 주입 : A의 생성자에서 직접 new B를 통해 B객체를 직접 생성하지 않고, B 객체를 인자로 외부에서 주입받는 식으로 실현이 가능 -> 이를 통해 B의 확장이나 변경이 A에 끼치는 영향이 적어지며, 코드의 결합도를 낮추고 유연성을 높일 수 있다

-> 의존성 주입 : 의존되는 객체가 변해도 의존하는 객체 코드 수정 불필요, 다른 클래스에 의존하고 싶다면 단순히 주입객체를 바꾸면 되기 때문에 클래스 간 결합도 낮아짐, 테스트 시 MOCK 객체 사용이 가능하여 단위테스트 용이

-> 의존성 주입 방법 : 생성자를 통한 의존성 주입(객체가 생성될 때 반드시 생성자를 통해 의존성을 주입 받아야 생성이 가능함 - 불완전한 상태로 객체가 생성되는 것을 방지, 필수 의존성 명시, 순환 의존성 방지 가능한 반면, 의존성이 많은 경우 복잡성 증가)  / Setter를 통한 의존성 주입 (선택적인 의존성 주입,유연성을 장점으로 하지만 / 반면 불완전한 상태가 가능해지며 순환 의존성의 위험이 있다)

 

 

과제였던 hello,spring을 출력하며 1주차 WIL 마무리~~