스프링부트 프로젝트 생성
위 사이트에서 스프링부트 프로젝트를 생성한다.
1. Project : maven이 익숙하지만 새로운 걸 써보고 싶고 gradle로 넘어가는 추세라고 해서 gradle을 선택함
2. Language : Java
3. Spring Boot : Spring Boot 3.3.5
- SNAPSHOT은 아직 만들고 있는 버전
- 그 외 옆에 뭐가 붙은건(RC1) 출시되지 않은 버전인듯
- 위의 경우를 제외한 가장 최신버전을 선택하면 된다.
4. Project Metadata
- Group : com.study (보통은 회사명을 작성하나 study라고 지어주었다.)
- Artifact : scheduler (프로그램 명을 작성한다.)
- Name, Description, Package name : 자동 작성되는 항목
- Packaging : Jar
* Jar(Java Archive)
: Java 프로젝트를 압축한 파일, JRE(Java Runtime Environment)만 있어도 실행 가능.
* War(Web Application Archive)
: 웹 어플리케이션 압축파일 포맷, 별도의 웹서버(WEB)나 웹컨테이너(WAS) 필요함.
* Was는 외장 WAS를 사용해야 하기때문에 Jar를 선택하였다.
스프링 부트에는 톰캣이 내장되어 있기 때문에, 외장 WAS를 사용하지 않는 것이 표준이기 때문이다.
즉, 스프링부트는 Jar로 더 편리하게 배포하고 동작할 수 있다.
- Java : 17
5. Dependencies
- Lombok
: 여러가지 어노테이션 제공, 컴파일 과정에서 자동으로 메소드를 생성/주입 방식으로 동작하게 하는 라이브러리
- Spring Web
- Thymeleaf
: html 템플릿 엔진
- Spring Security
: 계정별 데이터 연동이 필요해서 스프링시큐리티를 적용하고자 한다.
- MySQL Driver
: 제일 익숙한 디비를 선택하였다. https://okky.kr/questions/1501440?topic=questions&page=1
- Spring Web Service
GENERATE 버튼을 클릭하여 다운받은 후 압축해제를 하여 저장해둔다.
IDE에서 해당 프로그램을 불러오면 됨. (아래 참고)
File -> Open Projects from File System... 클릭
Directory... 버튼을 클릭하여 압축 풀어놓은 폴더 선택후 Finish
scheduler 프로젝트가 불러와졌고,
src > main > java > com > study > scheduler > SchedulerApplication.java 화면에서
우클릭 > Run As > Java Application 클릭하여 실행 후 localhost:8080 확인
로그인 화면이 뜬다면 잘 불러와진 것
* 위 화면은 dependency에 Spring Security를 추가시에만 뜨는 화면으로, 해당 의존성 주입하지 않았을 경우 뜨지 않음
위의 로그인 화면은 지금 당장 불필요하기 때문에 막아주는 세팅을 해야 한다.
src > main > java > com > study > scheduler 아래에
config 폴더 생성 > SecurityConfig.java 파일 생성한다.
다음으로 아래 코드를 작성한다.
해당 코드는 SecurityFilterChain을 Bean으로 등록하여
모든 경로에 대해 인증 없이 접근 허용을 해주는 코드이다.
package com.study.scheduler.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
http
.authorizeHttpRequests(auth -> auth
// .requestMatchers("/", "/login", "/join").permitAll() // 이 경로는 로그인 없이 접근 허용
// .requestMatchers("/admin").hasRole("ADMIN") // "/admin" 경로는 ADMIN 권한 필요
// .requestMatchers("/", "/home", "/public/**").permitAll() // 이 경로는 로그인 없이 접근 허용
// .requestMatchers("/admin/**").hasRole("ADMIN") // "/admin" 경로는 ADMIN 권한 필요
// .anyRequest().authenticated() // 그 외 모든 요청은 인증 필요
.anyRequest().permitAll() // 모든 경로에 대해 인증 없이 접근 허용
);
return http.build();
}
}
* @Bean 사용시, class에 @Configuration을 함께 사용해주어야 함
* @EnableWebSecurity : 스프링 시큐리티 관련한 웹 보안 활성화와 설정을 구성할 때 사용, 보통 @Configuration과 함께 사용됨
위 세팅까지 하고 다시 실행해보면 아래와 같은 화면과 함께 console창에 에러가 뜬다.
2024-11-01T05:41:54.890+09:00 DEBUG 1440 --- [scheduler] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : GET "/", parameters={}
2024-11-01T05:41:54.895+09:00 DEBUG 1440 --- [scheduler] [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler [classpath [META-INF/resources/], classpath [resources/], classpath [static/], classpath [public/], ServletContext [/]]
2024-11-01T05:41:54.909+09:00 DEBUG 1440 --- [scheduler] [nio-8080-exec-1] o.s.w.s.r.ResourceHttpRequestHandler : Resource not found
2024-11-01T05:41:54.920+09:00 DEBUG 1440 --- [scheduler] [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.servlet.resource.NoResourceFoundException: No static resource .]
2024-11-01T05:41:54.921+09:00 DEBUG 1440 --- [scheduler] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed 404 NOT_FOUND
2024-11-01T05:41:54.937+09:00 DEBUG 1440 --- [scheduler] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : "ERROR" dispatch for GET "/error", parameters={}
2024-11-01T05:41:54.938+09:00 DEBUG 1440 --- [scheduler] [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
2024-11-01T05:41:54.990+09:00 DEBUG 1440 --- [scheduler] [nio-8080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, text/html;q=0.8]
2024-11-01T05:41:55.006+09:00 DEBUG 1440 --- [scheduler] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Exiting from "ERROR" dispatch, status 404
아까 맨 처음 보았던 로그인 페이지가 통과된 후, "/"에 해당하는 경로를 보여주는 것인데
"/"에 대한 맵핑이 따로 없을 경우, 디폴트로 보여주는 html 파일이 없기 때문에 그렇다.
디폴트로 보여주는 html 파일은
위 경로의 static 폴더에서 index.html로 작성하면 된다.
index.html 작성 후 다시 실행해보면 잘 뜬다.
컨트롤러를 통한 "/" 경로의 맵핑을 구현하려면 아래처럼 하면 된다.
화면은 templates 아래 pages > main.html 파일을 생성하였고,
컨트롤러는 src > main > java > com > study > scheduler 아래 main > controller > MainController.java 생성하였다.
package com.study.scheduler.main.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MainController {
@GetMapping("/")
public String getMain(Model model) {
return "pages/main";
}
}
스프링 부트는 화면을 호출할 때 디폴트 경로를 templates 폴더로 본다.
그 아래 pages 폴더의 main.html 화면을 호출하는 컨트롤러이다.
다시 실행하면 처음 작성한 index.html 은 무시되고
맵핑해두었던 main.html 화면이 호출된다.
초기 세팅은 이렇게 끝!
음 gradle은 이렇게 생겼구나
보기 훨씬 편하다!!!!!!