상세 컨텐츠

본문 제목

스프링부트2 프로젝트를 스프링부트3로 마이그레이션_1/3

JSP·자바·코틀린

by 김일국 2024. 1. 28. 16:58

본문

### 스프링부트와 클라우드활용 강의용 깃 소스를 스프링부트2 프로젝트를 스프링부트3로 마이그레이션

- 기존 스프링부트2 프로젝트(v2.6.3) : https://github.com/kimilguk/kimilguk-boot2

- 마이그레이션 스프링부트3 프로젝트(v3.2.1) : https://github.com/kimilguk/kimilguk-boot3

- 기존 스프링부트2 프로젝트 : https://github.com/kimilguk/kimilguk-boot2

- 마이그레이션 스프링부트3 프로젝트 : https://github.com/kimilguk/kimilguk-boot3

- 참고로, Spring Boot3 버전부터 java17 아래버전으로 컴파일되지 않습니다.(자세한정보 아래)

- 2022년 11월에 기존의 Spring framework 5 와 Spring Boot 2.X 버전을 대체하는 Spring framework6 과 Spring Boot3 가 릴리즈 되었습니다.

- 스프링부트3에서 사용방법이 많이 변경된 이유는(아래)

- JavaEE(Enterprise Edition) 상표권은 오라클이 갖고 있어서 오픈소스 그룹인 이클립스 재단에서 JavaEE 패키지 이름인 javax.* 패키지들 중 일부만 사용할 수 있습니다.

- 예를 들면, javax.sql.DataSource 이나 javax.crypto.SecretKey, javax.sql  등등 과 같은 Open JDK 에 내장되어있는 패키지들은 사용패키지명이 바뀌지 않았습니다.

- 단, 이클립스 재단에서는 상표권에 제한을 받지 않는 버전으로 JakartaEE 이라 하고, 패키지는 jakarta.* 로 명명했습니다.

- 예를 들면, Spring Boot 3.x 에서는 JavaEE 가 아닌 JakartaEE 를 사용해야 하므로 javax.servlet 대신 jakarta.servlet 으로, javax.persistence 대신 jakarta.persistence 으로 소스를 변경 해야 합니다. 

- 그래서, 마이그레이션 하기 약간 번거롭습니다.(아래 역순으로 작업 중...)

07번 까지 작업한 결과화면(아래)

---------------------------------------------------------------------------------------------------------------------------------------------------

07_#스프링부트3에서 SecurityConfig.java파일에 기존 로그인 주석 후 메모리용 로그인 @Bean 추가(소스참조)

/* SecurityConfig.java 파일 중...
	@Override 스프링부트3에서 사용 못함(아래)
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth.jdbcAuthentication()
			.dataSource(dataSource)
			.rolePrefix("ROLE_")//현재 테이블에 저장될 때 ADMIN, USER로 저장되기 때문에 생략된 부분 추가
			.usersByUsernameQuery("select username, password, enabled from simple_users where username = ?")//로그인 인증 쿼리
			.authoritiesByUsernameQuery("select username, role from simple_users where username = ?");//DB에서 권한 가져오는 쿼리
		* 메모리용 인증과 권한 코딩
		 * auth.inMemoryAuthentication()
		 * .withUser("admin").password(passwordEncoder().encode("1234")).roles("ADMIN")
		 * .and()
		 * .withUser("user").password(passwordEncoder().encode("1234")).roles("USER")
		 * .and()
		 * .withUser("guest").password(passwordEncoder().encode("1234")).roles("GUEST");
		 *
	}
	*/
	
	// 스프링부트3에서 추가 : 메모리용 로그인 사용 시(아래)
	@Bean
	public InMemoryUserDetailsManager userDetailsService() {
		UserDetails admin = User.withUsername("admin")
				                .password(passwordEncoder().encode("12345"))
				                .roles("ADMIN")
				                .build();
        UserDetails user = User.withUsername("user")
				                .password(passwordEncoder().encode("12345"))
				                .roles("USER")
				                .build();
		return new InMemoryUserDetailsManager(admin, user);
	}

06_#스프링부트3에서 application.properties파일에 추가: 머스테치 화면의 한글 깨짐처리(아래)

# application.properties 파일 내용 중 스프링부트3에서...부분 추가(아래)
#위 oauth-local.properties(suffix접미사생략)
spring.profiles.include=db-postgres,oauth-goorm

#스프링부트3에서 추가 머스테치 화면의 한글 깨짐(아래)
server.servlet.encoding.force-response=true

#로깅레벨(많은내용 출력순서): debug>info>warn>error 등
logging.level.root=info

- server.servlet.encoding.force-response=true

05_스프링부트3 프로젝트와는 상관없는 Java학습용 java파일에 일괄변경된 부분 원상복귀

- jakarta.imageio -> javax.imageio;

- jakarta.swing -> javax.swing

04_WebSecurityConfigurerAdapter 는 deprecated 사용제외 되어서, import 구문 삭제

- SecurityConfig.java 에서 위 어댑터@Override 사용대신 @Bean으로 설정 후 내용 변경처리

// SecurityConfig.java 파일에서 아래 스프링부트3에서...부분 확인
@Bean //@Override 스프링부트3에서 대체 후 void 대신 SecurityFilterChain 추가
	protected SecurityFilterChain configure(HttpSecurity http) throws Exception {
		http//아래 메소드의 실행 순서는 역순으로 진행된다.
		.csrf((csrf) -> csrf.disable())//.csrf().disable()//Cross-site Request Forgery 취약점 사용안함
		.headers().frameOptions().disable().and()//h2-console 에서 iframe 하기 때문에
		/* 스프링부트3에서 제거
		.authorizeHttpRequests()//http 요청으로 권한설정을 시작
		.antMatchers("/api/file_download/**").permitAll()//회원로그인 하지 않은 상태로 다운로드 하기위해
		.antMatchers("/api/many_file_download/**").permitAll()//회원로그인 하지 않은 상태로 다운로드 하기위해
		.antMatchers("/mypage/**").hasRole(Role.USER.name())
		.antMatchers("/simple_users/**").hasRole(Role.ADMIN.name())
		.antMatchers("/posts/read/**").permitAll()
		.antMatchers("/api/**","/posts/**").hasAnyRole(Role.USER.name(),Role.ADMIN.name())
		.antMatchers("/**").permitAll()//우선 모든 경로는 권한 허용한다.
		.anyRequest().authenticated()//위 경로 Url 설정 이외의 모든 접속에 로그인 인증을 사용하겠다
		.and()
		*/
		//스프링부트3에서 추가 시작
		.authorizeHttpRequests(authorize ->
        authorize
        	.requestMatchers("/api/file_download/**").permitAll()
        	.requestMatchers("/api/many_file_download/**").permitAll()
            .requestMatchers("/mypage/**").hasRole(Role.USER.name())
            .requestMatchers("/simple_users/**").hasRole(Role.ADMIN.name())
            .requestMatchers("/posts/read/**").permitAll()
    		.requestMatchers("/api/**","/posts/**").hasAnyRole(Role.USER.name(),Role.ADMIN.name())
            .requestMatchers("/**").permitAll()
            .anyRequest().authenticated())
		//스프링부트3에서 추가 끝
		//스프링부트2 기존코드 시작 
		.logout()//스프링 시큐리티에 내장된 로그아웃 사용 내장된 Url: /logout
		.logoutSuccessUrl("/")
		.invalidateHttpSession(true)//로그아웃시 생성된 모든 세션 지우기
		.and()
		.formLogin()//스프링 시큐리티에 내장된 로그인 폼 사용 내장된 Url: /login
		.defaultSuccessUrl("/")//로그인 성공시 기본 이동 경로지정	
		.and()
		.oauth2Login()//OAuth2.0설정 시작명시
		.and()
		.oauth2Login()//OAuth2.0설정 시작명시
		.userInfoEndpoint()//네아로 로그인 성공 후 사용자 정보 가져오기 설정 자동생성
		.userService(customOAuth2UserService);//로그인 성공시 세션을 저장코딩을 추가할 OAuth2UserServic 시스템 클래스를 상속한 @서비스 만들예정
		//스프링부트2 기존코드 끝
		//스프링부트3에서 추가 시작
		http.httpBasic(Customizer.withDefaults());
        return http.build();
        //스프링부트3에서 추가 끝
	}

03_jakarta 일괄변경에서 제외해야 하는 항목SecurityConfig.java파일에서 jakarta.sql -> 다시 javax.sql 로 변경 처리한다.

02_스프링부트3에는_javax패키지명이_jakarta로변경되어서_소스일괄변경처리.(아래)

01_스프링부트3로프로젝트이름변경(build.gradle, setttings.gradle)+gradle폴더지우고, 부트3용 gradle폴더를 붙여넣은 후

- 위 작업내용은 이전 포스트 https://kimilguk.tistory.com/857 에서 [백엔드 개발환경] 부분에서 확인 가능하다.

- 기존 스프링부트2 프로젝트 import 하기(아래)

 

앞으로 // 스프링부트3에서 DB용 로그인 사용 시 소스 변환 작업을 할 예정 입니다.

 

Ps. 관련기술참조:

- 마이그레이션 일반: https://post.dooray.io/we-dooray/tech-insight-ko/back-end/4173/

- 마이그레이션 일반: https://techblog.lycorp.co.jp/ko/how-to-migrate-to-spring-boot-3

- 시큐리티심화: https://velog.io/@pizza_1/Spring-Security-6-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-2

관련글 더보기

댓글 영역