ㅁ 스프링 부트
- 스프링 레거시 프로젝트랑 같은데 스프링 부트 프로젝트를 하면 설정이 굉장히 간결해진다.
- logback.xml을 제외하고 xml 파일들이 사라진다. 하나의 properties 파일에 설정하면 끝이다.
- 스프링 부트도 하나의 프레임워크인데 스프링을 가져다 쓰고 있다.
스프링 기술들을 쓰는데 설정이 간편해진다.
- sts3에서도 부트프로젝트를 할 순 있지만 sts4로 한다.
- 우리가 쓰는 5.3.27버전은 11버전 이하를 호환이 잘된다.
Spring Boot 3는 Spring Framework 6을 기반으로 하고 있으며, Java 17 이상에서만 지원된다.
- 스프링 부트는 어떤 버전이 좋은지도 다 나와있어서 버전 관리하기도 용이하다.
ㅁ sts4 설치
- 작업 탐색기에서 상단의 '압축 풀기'를 눌러서 압축을 푼다.
c드라이브에 푼다. 이런 툴들은 c드라이브에 두는게 제일 좋다.
- 이름을 sts-4.26.0.RELEASE에서 STS4로 바꾼다.
- C:\Program Files\Amazon Corretto를 가보면 이전에 설치한 자바가 보여진다.
- 스프링 부트 3버전은 자바 17이상만 지원한다.
스프링을 하면서 자바 11버전을 사용했었다. 자바를 17버전으로 바꾼다.
- 내 PC 빈곳 우클릭 - 설정 - 고급 시스템 설정 - 환경 변수 - 아래 시스템 변수에서 path 클릭.
- path에서 17을 제일 위로 둔다.
(근데 자리 바꾸고 자바 17이 C:\Program Files\Amazon Corretto에 깔려는 있는데 path에서는 안보여서 새로 만들기로 추가했다)
- 또 시스템 변수에서 JAVA_HOME이 11로 되어 있는데 디렉터리 찾아보기로 17로 교체한다.
- cmd에서 java -version하면 현재 자바 버전이 17이라고 뜬다.
ㅁ C:\workspaces에 08_springboot-workspace 폴더를 만든다.
ㅁ sts4 실행
- C:\STS4의 SpringToolSuite4.exe로 STS4를 실행한다.
- 워크스페이스를 C:\workspaces\08_springboot-workspace를 선택해서 실행한다.
ㅁ 이클립스 플러그인 세팅 (이건 워크스페이스 설정이 아니라 이클립스라는 ide에 대한 세팅이다)
- 부트 프로젝트는 백엔드 용이다.
우리는 jsp를 써서 프론트와 백엔드를 같이 쓰고 있다.
근데 원래 부트프로젝트는 백엔드용으로 개발되었다 보니까 html css 파일 등을 여기서 만들 수가 없다.
- 상단 메뉴의 Help - Eclipse Marketplace... - web 검색 - 두번째 Eclipse Enterprise Java and Web Developer Tools 3.35를 install한다.
- 바로 confirm.
- accept하고 finish.
- select all하고 trust
- 그다음 restart now를 누른다.
ㅁ 워크스페이스 세팅
ㅁ 뷰 설정
- 뷰를 이렇게 설정했다.
- 서버는 부트 대시보드에 뜬다.
ㅁ spelling체크
- 다 utf-8일거다. 그래도 체크
ㅁ font
-basic textfont 가서 d2coding으로
ㅁ tab size 2로
ㅁ 템플릿
- java code style - code templates - 메소드바디, 캣치블럭바디 주석 지움.
ㅁ jsp 파일 의 templates
-html5 더블클릭해서 페이지 지시어 하단에 추가 2줄
ㅁ xml - xml catalog - user specified entries 등록
ㅁ xml(wild web developer)에서 deownload ~ dtd, xsd 첫번째 체크박스 체크.
=======
ㅁ 서버 세팅
- 부트는 내장 서버가 있다. 내장 톰캣이 있다.
내부적으로 아파치 톰캣 10버전을 쓴다.
- 톰캣 9버전, 10버전 차이가 있다.
- 서버세팅은 할 필요 없다.
=======
ㅁ new했을 때 뜨는 특징
window - perspective - customize perspective - shortcuts
- 메이븐은 체크해제
- Spring boot는 Spring Starter Project 체크
- Web에서 JSP File 체크. CSS File은 해도 되고 안해도 된다.
- XML에서 XML File 체크
ㅁ 새로운 Spring Starter Project 생성
- 패키지 익스플로러가 현재 텅 비어있다.
Create new Spring Starter Project를 클릭한다.
- 처음에 Service URL과 Name만 뜨면 좀 기다렸다가 다시 열면 제대로 뜬다.
- name은 boot (프로젝트 이름)
- Type은 Maven (빌드도구 선택)
- packaging은 War (개발끝나고 배포할때 압축시킬 파일의 타입)
- Languagae는 Java
- Java Version은 17(17이상만 있다)
- GroupId는 com.br
- ArtifactId는 boot
- Package는 com.br.boot
- Description은 설명이다. 수정해도 되고 그래도 둬도 된다. 그냥 둔다.
- 하단의 next.
- 스프링 부트 버전을 뭘로 쓸건지 선택한다.
스냅샷이나 rc1은 개발단계에선 사용가능하지만 운영할땐 문제가 생길수있는 베타버전이다.
스냅샷이나 rc1을 제외하면 버전이 3.3.5와 3.2.11만 남는다.
- 스프링 부트 버전은 3.2.11 버전을 선택한다.
3.3 버전대는 못쓴다. 스프링 마이바티스가 3.3.5를 지원하지 않기 때문이다.
- 참고로 전자정부 프레임워크는 부트버전은 더 옛날버전인 2.8버전이다. 우리는 3.2버전대로 한다.
2.8 버전대의 코드나 3.1 버전대의 코드나 별 차이가 없다.
- 스프링 부트 프로젝트를 만들면 좋은게 왠만한 라이브러리는 이미 다 추가되어있다.
- 라이브러리는 처음에 미리 추가하지 말고 나중에 필요할 때 가서 해야 한다.
- 그렇지만 처음 Spring Starter Project를 만들 때도 라이브러리 3개는 무조건 추가한다.
- lombok 검색 -> Lombok 체크
- devtools 검색 -> Spring Boot DevTools 체크
- spring web 검색 -> Spring Web 체크
- 내가 필요한걸 미리 추가하면 안된다. 그럼 세팅도 다 해야 한다.
나중에 프로젝트 우클릭 - Spring - Add Starters에서 이 창을 또 띄울수있으니 그때 추가하면 된다.
=================================================================
ㅁ springWeb를 springBoot로 마이그레이션
* Spring Legacy Project (Spring MVC Project) 작업시
- java version : 11
- apache tomcat version : 9 => javax.xxx
- IDE : STS3
- spring version : 5.3.27
* Spring Starter Project (Spring Boot Project) 작업시
- java version : 17
- apache tomcat version : 10 (내장톰캣) => jakarta.xxx (서버관련 클래스들 패키지)
- IDE : STS4
- spring boot version : 3.2.11 (내부적으로 스프링 버전을 6.1.14버전 사용 - 부트도 내부적으로 스프링 프레임워크를 가져와서 쓰고 있다.)
* Spring Boot 특징
- 스프링을 사용하기 위해서 여러가지 복잡한 설정들을 해야만 하는데(xml파일 활용해서)
스프링부트를 쓰면 복잡한 환경 설정들을 간소화할 수 있다.
- 개발자는 비즈니스 로직 구현에 집중할 수 있다.
- 내장 톰캣을 사용하고 있어서 빠르고 간편하게 배포 가능.
=================================================================
* workspace 세팅
(1) Eclipse Enterprises Java and Web Developer Tools 3.x.x 설치
(2) 기존의 세팅
- Window > view
- Window > preferences(인코딩 설정, 폰트 설정, tab size 설정, java template 설정, jsp template 설정, xml 카탈로그 등록)
- Window > perspective > customize perspective - shortcuts
- 서버 세팅은 안해도 됨(내장 톰캣이 있어서)
=================================================================
* 프로젝트 생성
(1) Spring Starter Project 생성
- Name : 프로젝트명
- Type : Maven (빌드도구)
- Packaging : War
- Java Version : 17
- Language : Java
- Group : com.br
- Artifact : boot
- Package : com.br.boot
- Spring Boot Version : 3.2.11 (반드시 3.2버전대. 3.3버전대 안됨)
스프링 부트가 3버전이 되면서 톰캣이 10버전 이상만 쓰게끔 되었다.
보통 톰캣이 버전 바꿀 때 많이 안바꾸는데 9버전에서 10버전으로 바뀌면서 굉장히 많이 바뀌었다.
- 저게 톰캣에서 제공하는 건데 클래스는 그대론데 패키지가 바뀌었다. javax에서 jakarta로.
- 파일 업로드도 톰캣 9에서는 되던게 10에서는 안되는 경우가 있었다.
(2) Dependencies 선택 (기본적으로 이 3개를 추가한 채로 프로젝트 생성)
- Lombok
- Spring Web
- Wpring Boot DevTools
(3) 폴더 구조
- src/main/java : java파일 (소스코드 작업)
- src/main/resources : 로그 설정문서, 마이바티스 관련 문서
- src/main/resources/static : 정적 자원 (이미지, js, css파일들)
- src/main/webapp/WEB-INF/views : jsp파일 (화면 작업)
- src/main/java 저 두개 클래스는 반드시 있어야 한다. 부트 프로젝트를 구동시켜주는 클래스다.
- src/main/resources에 logback 문서 등 만들었었다.
src/main/resources에 static 폴더가 들어있다.
정적 자원들을 src/main/webapp/resources에 보관했었는데 이제 정적자원들을 src/main/resources의 static 폴더에 둬야 한다.
- 스프링 부트에서는 mybatis.config 문서를 안써도 된다.
- src/main/webapp에 WEB-INF폴더, 그 아래 views 폴더가 없다 .직접 만들어야 함.
ㅁ pom.xml을 열어본다.
- 기존 spring legacy project의 pom.xml과 거의 비슷한데 조금 다르다.
- 라이브러리들도 서로서로 의존관계로 되어 있다.
이 라이브러리를 쓰기 위해서는 또다른 라이브러리가 필요하다.
그 모든 라이브러리들이 문제없이 버전이 다 호환되어야 한다.
부트에서는 그걸 아예 모아놓은 형태로 제공하고 있다.
- 여러 라이브러리들이 모인 패키지 형태다.
스프링 부트에서는 어떤 라이브러리에 어떤 버전이 호환이 맞는지 다 매핑되어있다.
ctrl누르면서 parent를 타고 들어가서 볼 수도 있다.
- 이제 maven repository 닷컴을 안가도 된다. 물론 필요에 따라 가는 경우도 있지만.
여기서 그냥 쓰면 자동완성이 된다.
- dependency도 ctrl 누르고 클릭하면 타고타고 들어갈 수 있다. 그 안에 어떤 dependency들이 있는지.
- pom.xml에서 엔터로 간격만 띄워놓았다. 수정한 것은 없다.
- 다른 프로젝트에서 쓰려고 이 pom.xml을 가져간다면 groupId, artifactId, name을 수정해야 한다.
ㅁ 서버 구동시에 문제가 없어야 한다.
- 부트 대시보드 탭을 보면 local 아래에 아무것도 없었는데 하나가 생겼다.
프로젝트 생성시 프로젝트명으로 추가되었다. 재생버튼을 눌러서 서버를 start 해본다.
- 오류가 난다. 오라클이 8080 포트를 이미 쓰고 있다.
그래서 포트번호를 수정해야 한다. src/main/resources의 application.properties에서 수정한다.
ㅁ application.properties
- properties 파일이니까 키-밸류 형태로 써주면 된다.
- 기본적으로 1줄이 써있다. 어플리케이션명으로 boot라고 되어있다. 이건 있어도 되고 없어도 된다. 그냥 둔다.
- 주석은 #쓰면 된다.
- server.port=8888를 작성하고 저장한다.
- 다른 프로젝트에서 쓰려고 이 application.properties를 가져간다면 spring.application.name=boot를 수정해야 한다.
- 저장을 눌렀더니 위와같은 에러 발생. Save as UTF-8을 누르면 된다.
ㅁ 서버 start
- 이젠 오류가 뜨지 않는다.
=================================================================
* jsp 사용을 위한 세팅
1) 라이브러리 추가 (pom.xml)
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
</dependency>
2) 뷰리졸버관련 세팅(prefix, suffix 등록) : application.properties
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
3) 기존 views 폴더 안 페이지들 복사
=================================================================
* migration 작업 - 리소스 핸들링
1. 기존 프로젝트의 정적자원들 (src/main/webapp/resources/ 안 폴더)을 static 폴더에 가져다 두기
2. 정적자원의 경로 재설정 (정적 자원 디렉토리 등록)
1) WebMvc 관련 세팅을 위한 @Configuration 클래스 만들기 : com.br.boot.config.WebMvcConfig
2) WebMvcConfigurer를 구현한 클래스로 만들기 : implements WebMvcConfigurer
3) addResourceHandlers 메소드 오버라이딩 후 아래 내용 참고해서 작성
registry.addResourceHandler("mapping값")
.addResourceLocations("location값")
3. server start 해서
localhost:8888 url 요청시 main 페이지 잘 뜨는지
* 기본적으로 contextPath가 ""로 설정 되어있음
---------------------------------------------------------------
* migration 작업 - 기존 프로젝트의 패키지 및 클래스들 복사해오기
1. 패키지 선언부 또는 import 다시 진행하기
2. 롬복 설치하기
---------------------------------------------------------------
* migration 작업 - BCryptPasswordEncoder 빈 등록
1. 라이브러리 등록 : pom.xml
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
2. BCryptPasswordEncoder 빈 등록
1) Spring Security 설정 관련 클래스 만들기 : com.br.boot.config.SecurityConfig
2) 해당 클래스에 @Configuration 작성
3) @Bean 으로 BCryptPasswordEncoder 빈 등록
---------------------------------------------------------------
* migration 작업 - MyBatis, logback, log4jdbc
1. OrcleDriver, MyBatis starter 라이브러리 등록
1) 프로젝트 우클릭 > Spring > Add Starters 선택후 dependency 선택
ㄴ Oracle Driver (SQL 안)
ㄴ MyBatis Framework (SQL 안)
2. mybatis 기존 mapper 파일 가져다 두기 : src/main/resources/mybatis/mappers/
3. db 연결 정보 등록 : application.properties
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=spring
spring.datasource.password=spring
4. mybatis 관련 구문 등록 : application.properties
mybatis.mapper-locations=mybatis/mappers/*.xml
mybatis.type-aliases-package=com.br.boot.dto
mybatis.configuration.jdbc-type-for-null=NULL
5. log4jdbc 라이브러리 추가 : pom.xml
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
6. logback, log4jdbc 기존 파일 복사해오기 : src/main/resources/
logback.xml 파일 패키지 수정
---------------------------------------------------------------
* migration 작업 - 파일업로드 (별도의 라이브러리 등록 필요 없음)
1. MultipartResolver 관련 등록 구문 : application.properties
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
2. FileUtil 클래스에 fileupload 메소드 안에 업로드 폴더 경로 수정
File filePathDir = new File("C:" + filePath);
---------------------------------------------------------------
* migration 작업 - Interceptor
1. 기존 프로젝트의 interceptor 클래스 복사
2. 해당 interceptor 클래스 빈으로 등록 (@Component)
3. 인터셉터 등록 : WebMvcConfig
1) Interceptor 객체 DI(의존성 주입)
2) addInterceptors 메소드 오버라이딩 후 아래 내용 작성
registry.addInterceptor(실행시킬Interceptor객체)
.addPathPatterns("url mapping값")
.addPathPatterns("url mapping값");
4. contextPath 이슈
- Interceptor 클래스에 contextPath로 리다렉트 구문 작성시
contextPath가 빈 문자열일 경우 이슈 발생 (제대로 redirect 되지 않음)
=> response.sendRedirect(request.getContextPath().equals("") ? "/"
: request.getContextPath()); 로 수정
---------------------------------------------------------------
* migration 작업 - Scheduler
1. 기존 프로젝트에서 Scheduler 클래스 복사
2. 해당 클래스 빈으로 등록 (@Component)
3. 스케줄링 활성화 : com.br.boot.BootApplication
@EnableScheduling 추가
---------------------------------------------------------------
* migration 작업 - WebSocket
1. 라이브러리 등록
1) 프로젝트 우클릭 > Spring > Add Starters
2) WebSocket (Messaging 안) dependency 추가
2. 기존 프로젝트 EchoHandler 클래스 복사
3. 해당 클래스 빈 등록 (@Component)
4. websocket 핸들러 등록
1) websocket 설정을 위한 클래스 만들기 : com.br.boot.config.WebSocketConfig
2) WebSocketConfigurer 구현 클래스로 만들기 : implements WebSocketConfigurer
3) EchoHandler 객체 DI
4) HttpSessionHandshakeInterceptor 빈으로 등록
5) registerWebSocketHandlers 오버라이딩 한 후 하단 구문 작성
registry.addHandler(구동시킬EchoHandler객체, "웹소켓연결을위한url")
.addInterceptors(httpSessionHandshakeInterceptor())
.withSockJS();
=================================================================
ㅁ jsp 사용을 위한 라이브러리 추가 (pom.xml)
- 스프링 부트는 백엔드 개발용으로 만들어졌다.
- 그래서 jsp를 쓰고 싶으면 라이브러리도 추가해야 한다.
톰캣 10으로 바뀌면서 추가해야하는 라이브러리도 바뀌었다.
- jsp를 사용하기 위해 dependency 를 추가한다.
- 그런데 지금 사용하려는 라이브러리는 초반에는 자동완성이 안돼서 MVN REPOSITORY에서 검색한다.
(1)
- 들어가서 버전 아무거나 선택해서 dependency를 복사한다.
여기서 앞에게 그룹id고 뒤에가 artifact id다.
검색은 항상 artifact id를 하면 된다.
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>11.0.0</version>
</dependency>
- 아무거나 가져왔다.
이걸 pom.xml에 쓰면 노란줄이 뜬다.
버전에 노란줄이 뜨면 version 태그를 생략하면 된다.
부트에서는 이미 몇버전과 호환되는지 정보가 등록되어 있다.
(2)
- 얘도 아무 버전이나 들어가서 dependency 태그를 복사해온다.
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.1.0</version>
<scope>provided</scope>
</dependency>
- version 생략 가능하다고 노란줄이 뜨고 scope는 지워줘야 한다. 둘 다 지운다.
(3)
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.2</version>
</dependency>
- 노라줄이 뜬다. 버전 지우면 된다.
- 근데 노란줄이 뜨면 지우고 노란줄이 안뜨면 버전을 지우면 안된다. 버전 정보가 없다는 거니까.
(4)
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>
- 얘도 버전을 지운다.
- jsp에서 jstl을 사용한다. jstl 사용을 위한 라이브러리다.
- jsp 사용을 위한 jasper 라이브러리 1개, jstl 사용을 위한 라이브러리 3개를 추가했다.
ㅁ webapp 폴더에 WEB-INF폴더와 views 폴더를 만든다.
- view 폴더 우클릭 new - jsp file
ㅁ src/main/webapp/WEB-INF/views에 main.jsp 생성
ㅁ com.br.boot.controller 패키지 생성
ㅁ spring legacy project 워크스페이스에서 MvcController 클래스를 복사해온다.
- C:\workspaces\07_spring-workspace\springWeb\src\main\java\com\br\spring\controller에서 MvcController.java를 복사
- 패키지 선언부를 com.br.boot.controller로 수정한다.
- @GetMapping을 잠깐 @RequestMapping으로 바꿔보면 파란줄이 뜬다.
스프링 부트에서는 @GetMapping, @PostMapping으로 요청방식을 지정해서 쓰라고 하고 있다.
ㅁ 부트에서는 기본적으로 컨텍스트 패스가 없다. 빈문자열이다.
- 컨텍스트패스를 생략해도 된다.
- Spring Boot는 기본적으로 context path 없이 루트 경로(/)에서 애플리케이션을 실행하도록 되어 있다.
ㅁ 물론 컨텍스트 패스를 등록할 수 도 있다.
- application.properties 또는 application.yml 파일에서 설정할 수 있다.
application.properties에 server.servlet.context-path=/your-context-path를 작성하면
브라우저 주소창에 http://localhost:8080/your-context-path를 쳐서 갈 수 있다.
- 부트에서는 많이들 컨텍스트패스 없이 한다. 우리도 주석처리한다.
ㅁ 서버 start
- 브라우저 주소창에 "localhost:8888"를 입력해본다.
- 스프링 부트하면서 자주 보게 될 whitelabel error page가 뜬다.
- 뷰 리졸버에 뭐 등록을 한 적이 없다.
prefix와 suffix를 설정하지 않아서 지금 오류가 뜬다.
- servlet-context.xml에 빈을 등록하면서 이 둘을 설정했었다
부트에서는 이런 xml파일이 없다. application.properties 파일에 작성하면 된다.
ㅁ application.properties
- 빈등록을 할 필요가 없다. 왜냐면 부트측에서 ViewResolver를 빈으로 가지고 있다. prefix와 suffix 값이 비어있는 상태일 뿐이다.
- 잘 뜬다.
ㅁ gitignore
- boot project를 깃으로 올릴때는 application.properties 파일도 올려야 된다.
- gitignore 문서에서 *.properties는 없애거나 주석처리(앞에 # 붙이면 주석처리)해야된다.
'Spring' 카테고리의 다른 글
[스프링부트] 3. 패키지 안 클래스들 migration (0) | 2024.11.06 |
---|---|
[스프링 부트] 정적자원 디렉토리 등록하기 (WebMvcConfigurer) (0) | 2024.11.05 |
[스케줄러] (2) | 2024.11.05 |
[인터셉터] (0) | 2024.11.05 |
[웹소켓] 2. (2) | 2024.11.04 |