사이먼's 코딩노트

[SpringBoot] Spring Security / JPA 본문

Java/SpringBoot

[SpringBoot] Spring Security / JPA

simonpark817 2024. 5. 6. 22:00

[Spring Security]

  • 이번에는 스프링 부트를 통해 프로젝트를 생성하고 스프링 시큐리티를 적용하는 방법에 대해서 알아봅시다.
  • 스프링 시큐리티는 기본적으로 인증되지 않은 사용자가 sbb와 같은 웹 서비스를 사용할 수 없게 만든다.
  • 따라서 이와 같은 인증을 위한 로그인 화면이 나타나게 되는데, 이러한 스프링 시큐리티의 기본 기능을 sbb에 그대로 적용되면 곤란하기 때문에 설정을 통해 바로 잡아야한다.
  • 스프링 시큐리티를 적용하게되면 로그인을 하지 않아도 게시물을 조회할 수 있다.
  • SecurityConfig.java 클래스를 하나 생성한 다음 아래와 같은 코드를 작성한다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests
                        .requestMatchers(new AntPathRequestMatcher("/**")).permitAll())
        ;
        return http.build();
    }
}
  • @Configuration은 이 파일이 스프링의 환경 설정 파일임을 의미하는 어노테이션이고, 여기서는 스프링 시큐리티를 설정하기 위해 사용했다.
  • @EnableWebSecurity는 모든 요청 URL이 스프링 시큐리티의 제어를 받도록 만드는 어노테이션이고, 이 어노테이션을 사용하면 스프링 시큐리티를 활성하는 역할을 한다.
  •  내부적으로 SecurityFilterChain 클래스가 동작하여 모든 요청 URL에 해당 클래스가 필터로 적용되어 URL별로 특별한 설정을 할 수 있게 된다.
  • 스프링 시큐리티의 세부 설정은 @Bean 어노테이션을 통해 SecurityFilterChain 빈을 생성하여 설정할 수 있다.
  • http 안에 작성된 코드는 인증되지 않는 모든 페이지의 요청을 허락한다는 의미로 로그인하지 않더라도 모든 페이지에 접근이 가능하게 한다.

 

[메인 컨트롤러 추가]

  • 이번에는 스프링 부트 게시판 즉, sbb를 본격적으로 만들면서 스프링 부트의 기능을 하나씩 익히고 동작 원리에 대해 더 자세히 알아봅시다.
  • 먼저, 웹 브라우저에서 localhost:8090/sbb 페이지를 요청했을 때 문자열이 출력되도록 해봅시다.
  • 메인 컨트롤러를 추가하기 전, 해당 URL주소를 요청하게 되면 당연히 오류가 발생한다.
  • 그 이유는 브라우저가 요청한 페이지를 찾을 수 없기 때문이다. 다시 말해 스프링 부트 서버가 localhost:8090/sbb라는 요청을 해석할 수 없다는 뜻이다.
  • 이를 해결하기 위해선 /sbb URL에 대한 매핑을 추가해야한다. 브라우저와 같은 클라이언트의 페이지 요청이 발생하면 스프링 부트는 가장 먼저 컨트롤러에 등록된 URL 매핑을 찾고, 해당 URL 매핑을 발견하면 URL 매핑과 관련된 메서드를 실행한다.
  • MainController.java 클래스를 하나 생성한 다음 아래와 같은 코드를 작성한다.
@Controller
public class MainController {
    @GetMapping("/sbb")
    @ResponseBody       
    public String index() {
        return "안녕하세요!!!";
    }
}
  • @Controller 어노테이션을 적용하면 MainController.java 클래스는 스프링 부트의 컨트롤러가 된다는 뜻이다.
  • @GetMapping 어노테이션은 요청된 URL(/sbb)과의 매핑을 담당하고, 브라우저가 해당 URL을 요청하면 스프링 부트는 요청 페이지와 매핑되는 메서드를 찾아 실행한다.
  • 다시 말해, 스프링 부트를 웹 브라우저로부터 localhost:8090/sbb 요청이 발생하면 /sbb URL과 매핑되는 index() 메서드를 MainController.java 클래스에서 찾아 실행하게 된다는 뜻이다.
  • @GetMapping에서는 도메인명과 포트번호는 작성하지 않는다.
  • @ResponseBody 어노테이션은 URL 요청에 대한 응답으로 문자열을 리턴하라는 의미이다. 만약 해당 어노테이션을 생략한다면 스프링 부트는 '안녕하세요!!!' 라는 문자열을 리턴하는대신 '안녕하세요!!!' 라는 이름의 템플릿 파일을 찾게 된다.

localhost:8090/sbb의 응답

 

[JPA 적용]

  • 앞으로 DB를 통해 게시물의 질문과 대답에 대한 테이블을 조회 및 저장하기 위해 JPA를 사용해야한다.
  • 스프링 부트는 JPA를 사용하여 DB를 관리하고, JPA는 인터페이스 모음이므로 해당 인터페이스를 구현한 실제 클래스가 필요하다.
  • JPA를 구현한 실제 클래스에는 대표적으로 Hibernate(하이버네이트)가 있다.
  • 하이버네이트는 JPA의 인터페이스를 구현한 실제 클래스이자 자바의 ORM 프레임워크로, 스프링 부트에서 DB 관리를 쉽게 도와준다.
  • 먼저, 엔티티로 각 DB 테이블을 매핑하기 전에 application.yml에서 JPA를 사용하기 위한 준비 작업이 필요하다.
server:
  port: 8090
spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/sbb_dev
    username: root
    password:
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  • 'jpa: hibernate: ' 는 스프링 부트와 하이버네이트를 함께 사용할 때 필요한 설정 항목이다.
  • 'ddl-auto: update' 는 엔티티를 기준으로 데이터의 테이블을 생성하는 규칙을 설정한다.
  • update로 설정하였다면, 스프링 부트 서버가 재시작 되어도 엔티티의 변경된 부분만 DB에 적용하도록 한다.
  • 만약 create로 설정하였다면, 스프링 부트 서버를 시작할 때마다 테이블을 모두 삭제하고 다시 생성하도록 한다.
  • 개발 환경에서는 보통 update 모드를 사용하는 것이 좋다.

 

반응형