본문 바로가기

spring boot

JPA / spring boot (TemplateInputException, dotenv, spring-security / Bcrypt) 회원가입 완성

TemplateInputException (해당 템플릿을 찾을 수 없습니다.)

로그인, 회원가입 폼을 만들다 TemplateInputException 이 발생했다.

타임리프가 해당 템플릿 파일을 찾을 수 없다는 에러였다.

 

원인이 뭔지 찾다가 해당 클래스에 @RestController 를 붙이면 해결된다는 말을 들었다.

그런데 현재 내 컨트롤러는 뷰단을 반환해야 하는 경우도 있기에 @RestController 는 쓸 수 없었다.

 

이에 해당 API에 @ResponseBody를 붙이니 해결되었다.

 

spring-dotenv

application.properties 파일에 내 DB에 관한 정보가 들어있다.

이를 .env 파일로 빼서 쓰고 싶은데 spring 기반에선 dotenv 라는 라이브러리를 사용해야 .env를 인식한다고 한다.

implementation 'io.github.cdimascio:dotenv-java:2.2.0'

 

이 코드를 build.gradle 에 추가하고 로드하자.

 

라이브러리가 다운이 완료되었으면 프로젝트 루트 디렉토리에 .env 파일을 생성하고

알맞은 변수명에 해당 정보를 기입한다.

 

main 메서드에서 dotenv 를 실행하고 .env 의 정보들을 환경변수로 설정하자.

// .env 파일 로드
Dotenv dotenv = Dotenv.load();

// .env 안의 값들을 시스템 환경변수로 설정
System.setProperty("DB_URL", dotenv.get("DB_URL"));
System.setProperty("DB_USERNAME", dotenv.get("DB_USERNAME"));
System.setProperty("DB_PASSWORD", dotenv.get("DB_PASSWORD"));
System.setProperty("DB_DRIVER_CLASS", dotenv.get("DB_DRIVER_CLASS"));

 

spring.application.name=userJoin
spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.driver-class-name=${DB_DRIVER_CLASS}

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=update 

spring.thymeleaf.prefix=classpath:/templates/

 

환경 변수로 설정이 끝났다면, application.properties 파일에 위처럼 변수화된 정보로 내 정보를 가릴 수 있다.

 

Bcrypt

회원가입을 진행할 때, 비밀번호를 그대로 DB에 저장시키면 보안적으로 상당히 위험하다.

그렇기에 Bcrypt 같은 암호화 라이브러리를 사용해 암호화 시킨 비밀번호를 DB에 저장한다.

 

이를 사용하려면 spring-security 를 사용하거나 그 안의 Bcrypt 모듈만 빼서 사용할 수 있다.

일단 난 spring-security 를 사용했다.

implementation 'org.springframework.boot:spring-boot-starter-security'

 

build.gradle 에 라이브러리를 추가해주고

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 filterChain(HttpSecurity http) throws Exception {
        // csrf 끄기
        http.csrf((csrf) -> csrf.disable());
        http.authorizeHttpRequests((authorize) ->
                authorize.requestMatchers("/**").permitAll() // 해당 url에 로그인 여부 지정 가능 // premitAll() 모두 해제
        );
        return http.build();
    }
}

 

SecurityConfig 라는 클래스를 프로젝트에 생성한다.

난 직접 로그인, 회원가입을 만들 예정이라 csrf는 껐다.

 

("/url").permitAll() - /url 에 로그인 여부가 상관없이 모든 사용자가 접근할 수 있게 하는 메서드

기존 글에도 Bcrypt, RSA를 다룬 글이 있긴한데 인강 없이 혼자 해보는 중

 

 

PC 사이즈

 

 

태블릿 및 모바일 사이즈