출처 :
www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1/dashboard
목표
- 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로도 충분
}
}
'프로젝트 정리 > 스프링과 JPA 기반 웹 애플리케이션 개발' 카테고리의 다른 글
6 - 1 . 회원 가입 : 폼 서브밋 검증 (0) | 2021.02.16 |
---|---|
5. 회원가입 뷰 (0) | 2021.02.16 |
3. 계정 도메인 (0) | 2021.02.15 |
자바 환경변수 java -version javac -version 다를때 (0) | 2021.02.11 |
2. 프로젝트 만들기 (0) | 2021.02.11 |