SSinsa
개발자인척) 1회 - 환경 셋팅부터 본문
2019.04.27 스터디 결성 시작
주제는 Spring Boot로 선정
첫주 과제는 환경 셋팅 후 Hello world 출력하기!!!!
1) 설치
기존에 있던 이클립스로 뽀짝뽀짝해보려다...
STS 4를 설치할 수 없다는 사실에 JDK도 새로 다운했지만,
또 안돼서;; 이클립스도 다시 깔았다.
- jdk1.8.0_212
- eclipse-jee-2019-03-R-win32-x86 64
결국 나는 Spring Tools 4 (aka Spring Tool Suite 4) 4.0.0.RELEASE
이걸 설치할 수 있었다!!!!
설치를 모두 완료하고 이클립스를 재시작하고 난 후 다음 단계는 그레이들 차례
인턴 당시 maven을 통해 설정했던 것 같은데 실무에서는 gradle을 사용하고 있어서
매번 도대체 둘에 차이가 뭐냐고 엄청 물었던 것 같은데...
이번에 제대로 알게 되었다는 사실......
※ WHY? 그레이들 >>>>>>>>> 메이븐
메이븐은 XML 기반으로 의존성 및 디렉터리 구조 관리 등의 기능을 제공.
BUT 라이브러리가 추가되거나 각각의 라이브러기가 서로 다른 버전의 라이브러리를 참조하는 종속성을 가질 경우 관리가 어려워짐. (헐,,, 완전 공감...) AND XML의 특징인 구조화는 사람이 알아보기에는 쉽지만 XML 문서의 양이 방대해지는 단점
그레이들은 JVM기반의 빌드 도구이며 메이븐 등과 호환 가능. 설정이 간편, 프로젝트별로 유연하게 설정할 수 있는 등의 장점.
출처) 스프링부트 시작하기 - 김인우 지음
이러한 이유에서 그레이들 플러그인을 설치하고, 그레이들 에디터를 설치하였다.
- Buildship Gradle Integration 3.0
- Minimalist Gradle Editor 1.0.1
2) 프로젝트 생성
그럼 왜 스프링 부트일까? 스프링으로 개발해본 사람은 알테지만 매우 많은 작업이 필요하다.
그렇지만 스프링 부트는 이러한 스프링의 단점을 말끔히 해결해준다!!
※ WHY? Spring Boot?????
- 프로젝트에 따라 자주 사용되는 라이브러리들이 미리 조합됨
- 복잡한 설정 자동 처리!
- 내장 서버 포함 -> 서버 추가 설치 불필요
- WAS에 배포하지 않고도 실행할 수 있는 JAR 파일로 웹 애플리케이션을 개발할 수 있음
출처) 스프링 부트 시작하기 - 김인우 지음
File -> New -> Spring Starter Project 로 프로젝트 생성 시작!

메이븐말구 그레이들 쓸거라서 이런식으로 그레이들로 프로젝트를 만들었다.
그러고 Web의 Web과 Core의 DevTools 의존성을 추가해주고 프로젝트 생성!
바로 기대하며 Run!! 했더니....
org.apache.catalina.LifecycleException: Protocol handler start failed
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1008) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:226) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:259) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:197) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:311) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:164) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552) [spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at sample.SampleApplication.main(SampleApplication.java:10) [main/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_212]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_212]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_212]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_212]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.1.4.RELEASE.jar:2.1.4.RELEASE]
Caused by: java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_212]
at sun.nio.ch.Net.bind(Net.java:433) ~[na:1.8.0_212]
at sun.nio.ch.Net.bind(Net.java:425) ~[na:1.8.0_212]
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) ~[na:1.8.0_212]
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) ~[na:1.8.0_212]
at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:236) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:210) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1103) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1189) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:568) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1005) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
... 19 common frames omitted
2019-05-01 21:36:19.878 INFO 11720 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2019-05-01 21:36:19.885 INFO 11720 --- [ restartedMain] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-05-01 21:36:19.890 ERROR 11720 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured.
Action:
Verify the connector's configuration, identify and stop any process that's listening on port 8080, or configure this application to listen on another port.
2019-05-01 21:36:19.891 INFO 11720 --- [ restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
이런 에러가 잔뜩 ㅠㅠㅠㅠㅠㅠ
port가 이미 사용중이라서 그렇다는 말을 듣고 port 변경 방법을 찾아보니
application.properties 파일에 server.port=8099 로 입력 후 저장한 뒤 재시작했더니.....
2019-05-01 22:11:03.004 INFO 13356 --- [nio-8099-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-05-01 22:11:03.012 INFO 13356 --- [nio-8099-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms
위와 같은 성공 메세지와 함께

브라우저로 결과가 확인된다!
이제 과제의 끝인 Hello World 출력하러 ㄱㄱ
3) Hello World
먼저 패키지와 클래스를 생성한다.
책에 나온대로 sample 밑에 controller 패키지를 만들고 그 밑에 HelloController.java 클래스를 만들었다.
클래스 파일에 아래와 같이 코드를 작성!
package sample.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/")
public String hello() {
return "Hello World!";
}
}
이때 어노테이션들이 등장하는데 책에서 자세히 설명해주어서 여기에도 기입한닷!!
※ @@@@@???
- @RestController : 해당 클래스가 REST 컨트롤러 기능을 수행하도록 도와줌
- @RequestMapping : 해당 메서드를 실행할 수 있는 주소를 설정, 위에 코드는 어플리케이션의 기본 주소를 "/"로 지정, 이는 특별한 주소를 입력하지 않을 때 실행되는 주소를 의미!
출처) 스프링 부트 시작하기 - 김인우 지음
자! 이렇게 하면 결과는.....................!!!

짜잔!!
이렇게 과제 완료!
TO BE CONTINUED
'Spring > Spring Boot' 카테고리의 다른 글
| 개발자인척) 1.5회 - git hub 커밋 (0) | 2019.05.02 |
|---|