상세 컨텐츠

본문 제목

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

JSP·자바·코틀린

by 김일국 2024. 1. 30. 12:46

본문

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

- 이전 포스트 https://kimilguk.tistory.com/861 에 이어서 계속 작업 합니다.

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

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

09번 까지 작업한 결과화면(DB회원으로 로그인 후 새글을 등록한 화면-아래)

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

09_#글읽기에서 에러메세지 처리(아래 해결방식 1을 사용): Ensure that the compiler uses the '-parameters' flag

스프링부트 3.2버전 부터는 자바 컴파일러에 -parameters 옵션을 넣어주어야 애노테이션의 이름을 생략할 수 있다.
@RequestParam, @PathVariable 두 어노테이션에서 발생하는 문제
해결방식 1) 이클립스 컴파일 시에 -parameters 옵션 적용
-> 이클립스 window메뉴-Preferences창-Java메뉴-Compiler서브메뉴-제일하단체크(아래 이미지 참조)
해결방식 2)
@GetMapping("/posts/read/{id}")//패스경로에 id값이 들어갔다. @PathVariable 사용해서 자바코드에서 사용
	public String postsRead(@PathVariable Long id, ...생략 Fail
-> public String postsRead(@PathVariable("id") Long id, ...생략 Ok
위 화면대로 수정 후 Apply and Close 버튼을 누르면 re-build 하겠다는 안내창이 나오면, OK 버튼 클릭하면 된다.

08_#스프링부트3에서 추가 : DB용 로그인 사용 시 처리(아래)

/* 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에서 추가 : DB용 로그인 사용 시(아래)
    // WebSecurityConfigurerAdapter 방식으로 인증 처리를 진행 하기 위해 기존엔 Override 하여 구현했지만
    // Spring Security 6/스프링부트3 부터는 AuthenticationManagerBuilder를 직접 생성하여 AuthenticationManager를 생성해야 한다.
    @Autowired
    public 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에서 권한 가져오는 쿼리
    }
// 스프링부트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);
    }
    */

- 이 전 내용은 지난 포스트글에 있습니다. 이전 포스트 https://kimilguk.tistory.com/861 

 

앞으로 위 소스를 K-PaaS 컨테이너 플랫폼에 배포 할 예정 입니다.

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

### 위 h2-db 를 사용한 내용이 정상 작동해서 그대로 넘어 갔다가....

       최근에 postgreSQL db로도 테스트 하다가, 아래 2가지 문제가 발견 되었다.

- 1).아래 DB 생성 명령이 실행 되지 않는 문제 처리

spring.jpa.hibernate.ddl-auto=create

원인은 스프링부트3에서 application-db-postgres.properties 파일 상단의 설정 명령어가 변경 되었기 때문이다.(아래)

#spring.datasource.initialization-mode=always #스프링부트3(2.5 이후) 아래로 변경

spring.sql.init.mode=always

- 2).아래 샘플sql이 실행 시 저장이 되지 않는 문제 처리

#spring.datasource.schema=classpath:import_dummy.sql #스프링부트3(2.5 이후) 아래로 변경 import_dummy.sql내용에서 필드명도 추가했음.(큰 문제는 아니고, 필드 순서가 맞지 않는 문제 발생되어서...)

#spring.datasource.schema → spring.sql.init.schema-locations #JPA를 사용하기 때문에 필요없음

#spring.datasource.data → spring.sql.init.data-locations # 실제는 변경된 이 명령어로 더미 데이터를 입력 가능하다.

spring.sql.init.data-locations=classpath:import_dummy.sql

위 추가로 적용한 소스도 깃에서 확인 가능하다.->  https://github.com/kimilguk/kimilguk-boot3

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

Ps. 관련기술참조:

- DB용시큐리티참조 : https://dev-log.tistory.com/4

관련글 더보기

댓글 영역