개인프로젝트/스케줄러 프로그램

스프링부트 프로젝트 생성

여행자0 2024. 11. 1. 04:41

 

 

https://start.spring.io/

위 사이트에서 스프링부트 프로젝트를 생성한다.

 

+) dependency에 Spring Boot DevTools도 추가해주었습니다. (코드 수정시 자동으로 서버 재빌드 위함)

 

 

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은 이렇게 생겼구나

보기 훨씬 편하다!!!!!!