### 스프링부트와 클라우드활용 강의용 깃 소스를 스프링부트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
스프링부트2 프로젝트를 스프링부트3로 마이그레이션_3/3 (1) | 2024.01.31 |
---|---|
스프링부트2 프로젝트를 스프링부트3로 마이그레이션_2/3 (0) | 2024.01.30 |
헤로쿠 클라우드플랫폼 기존에 사용하던 스택 업그레이드 (0) | 2022.08.19 |
코트린 프로젝트17 (0) | 2022.06.03 |
코틀린 프로젝트16 (0) | 2022.05.30 |
댓글 영역