프로젝트 정리/스프링과 JPA 기반 웹 애플리케이션 개발

4. 회원가입 컨트롤러

출처 : 

www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1/dashboard

 

스프링과 JPA 기반 웹 애플리케이션 개발 - 인프런

이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습

www.inflearn.com

 

목표

  • Get "/sign-up" 요청을 받아서 account/sign-up.html 페이지를 보여준다.
  • 회원 가입 폼에서 입력 받을 수 있는 정보를 "닉네임", "이메일", "패스워드" 폼 객체로 제공한다.

model 객체에 닉네임 이메일 패스워드 객체를 생성 

 

account package ->

AccountController Class

package com.studyolle.account;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class AccountController {

    @GetMapping("/sign-up")	// GET 요청으로 sign-up이 들어오면
    public String signUpForm(Model model) {
    // model 객체는 나중에 채울것
        return "account/sign-up";
       
        // thymeleaf가 의존성에 들어있으면
        // org.springframework.boot.autoconfigure.thymeleaf; 자동설정에 의해
         // resource -> templates -> account -> sign-up.html mapping
    }
}

크롬 -> 시크릿모드로 접근해야 db기록등이 남지 않은 상태로 접속 가능

SpringSecurity에 의해서 접근이 막힘

 

-> config -> SecurityConfig Class

package com.studyolle.config;


import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //EnableWebSecurity -> 직접 스프링 시큐리티 설정을 하겠다는 어노테이션
    // websecurity 설정을 좀 손쉽게 하려면 WebSecurityConfigurerAdapter를 상속

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 원하는 특정 요청들을 authorize 체크를 하지 않도록 걸러낼 수 있음
        http.authorizeRequests()
                .mvcMatchers("/", "/login", "/sign-up", "/check-email", "/check-email-token",
                "/email-login", "/check-email-login", "/login-link").permitAll()       // mvcMatchers로 해당 링크는 모두 허용한다.
                .mvcMatchers(HttpMethod.GET, "/profile/*").permitAll()      // profile 링크는 GET만 허용한다.
                .anyRequest().authenticated();                     // 그 외 링크는 모두 인증해야 쓸 수 있다.

    }
}

 

테스트하기

Intellij window 테스트 생성 단축키 ( ctrl + shift + t )

AccountControllerTest Class

package com.studyolle.account;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

import static org.junit.jupiter.api.Assertions.*;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;

@SpringBootTest
@AutoConfigureMockMvc 
class AccountControllerTest {
//컨트롤러 부터 밑 클래스까지 모두 테스트 할 것

    @Autowired private MockMvc mockMvc;

    @DisplayName("회원 가입 화면 보이는지 테스트")
    @Test   //Junit5
    void signUpForm() throws Exception {
        mockMvc.perform(get("/sign-up"))	//get으로 /sign-up을 보냈을 때
                .andDo(print())
                .andExpect(status().isOk())	// 200이면 응답처리가 된 것
                .andExpect(view().name("account/sign-up")); // view가 보이는지

        // 200이 나오는 것으로 테스트 되는 것
        // security가 적용이 되면 sign-up form에 접근할 때
        // Access Denied Exception이 발생
        // 이 exception이 발생한 것을 security Filter가 잡아서
        // form generation 과 함께 login form을 보여주게 되어있음
        // 고로 200이 나오면 view가 제공 된다고 볼 수 있음
        // 보고 싶으면 andDo(print())로 볼 수 있음
        // thymeLeaf라서 viewTempalte rendering을 실제 servlet container가 하지 않고
        // view 생성을 해서 응답을 보여줌 
        // MockMvcTest로 해도 View까지 테스트 가능
        // SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
        // SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
        // 로 하면 servlet이 실제로 뜬다
        // 위 어노테이션으로 Servlet을 띄울때는
        // @AutoConfigureWebTestClient or AutoConfigureWebClient을 사용하겠지만
        // Thymeleaf를 사용해서 MockMvcTest로도 충분
    
    }
}