스프링과 JPA 기반 웹 애플리케이션 개발 #8 회원 가입 컨트롤러

Jake Seo·2021년 5월 25일
0

스프링과 JPA 기반 웹 애플리케이션 개발 #8 회원 가입 컨트롤러

해당 내용은 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발의 강의 내용을 바탕으로 작성된 내용입니다.

강의를 학습하며 요약한 내용을 출처를 표기하고 블로깅 또는 문서로 공개하는 것을 허용합니다 라는 원칙 하에 요약 내용을 공개합니다. 출처는 위에 언급되어있듯, 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발입니다.

제가 학습한 소스코드는 https://github.com/n00nietzsche/jakestudy_webapp 에 지속적으로 업로드 됩니다. 매 커밋 메세지에 강의의 어디 부분까지 진행됐는지 기록해놓겠습니다.


회원가입: 컨트롤러

목표

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

기본 컨트롤러 작성하기

도메인을 기준으로 패키지를 구성하는 방식으로 패키지를 구성하였다. Controller, VO 등의 패키지를 만들고 그 내부에 해당하는 클래스를 만들지 않고, 계정이라는 도메인을 영문화하여 Account라는 패키지명을 만들고, 그 내부에 AccountController를 작성하였다.

package com.jakestudy.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")
    public String signUpForm(Model model) {
        return "account/sign-up";
    }
}

먼저 에러 해결하기 (나만 발생한 에러)

Thymeleaf 의존성이 없어서 계속 View를 못찾는 문제가 발생하였었다. Thymeleaf 의존성을 설치해주었다.

계속 문제가 발생했다.

spring-boot-starter-thymeleaf를 설치해주어야 문제가 발생하지 않는다.

HTML 파일 작성해주기

resourcestemplates 패키지를 생성 후에 그 안에 html 파일을 작성해주면 된다. Thymeleaf 기본 경로다.

에러 해결 확인하기

경로가 잘 잡혔다.

스프링 시큐리티 설정해주기

처음 프로젝트를 생성할 때, 스프링 시큐리티 의존성을 추가해서 스프링 시큐리티가 자동으로 들어있다. 스프링 시큐리티의 초기 설정은 모든 페이지에 접근할 때 권한을 요구하므로, 일부 전체 회원에게 권한이 있는 페이지는 따로 인증을 받지 않아도 보이게 만들어야 한다.

@Configuration
@EnableWebSecurity // 웹 시큐리티 설정을 직접 하겠다는 애노테이션
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // 웹 시큐리티 설정을 좀 더 간편하게 하기 위해 WebSecurityConfigurerAdapter 를 상속

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .mvcMatchers("/", "/login", "/sign-up", "/check-email", "/check-email-token",
                        "/email-login", "/check-email-login", "login-link").permitAll()
                .mvcMatchers(HttpMethod.GET, "/profile/*").permitAll()
                .anyRequest().authenticated();
    }
}

.mvcMatchers() 혹은 .anyRequest() 메소드를 통해 메소드체인 형식으로 특정 경로를 지정할 수 있고 해당 경로에 대해 .permitAll()을 하면 그냥 모든 사용자가 접근 가능한 것이고, .authenticated()를 하면 인증을 받은 사용자만 접근이 가능한 것이다.

스프링 시큐리티를 잘 몰랐는데, 멋진 기술인 것 같다. 스프링 시큐리티에 대한 지식은 추후 배워야 할 것 같다. 여기에 스프링 시큐리티 강좌 링크가 있다.

컨트롤러 테스트 코드 작성하기

@SpringBootTest
@AutoConfigureMockMvc
// @AutoConfigureWebMvc, WebClient로도 가능
class AccountControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @DisplayName("회원 가입 화면 보이는지 테스트")
    @Test
    void signUpForm() throws Exception {
        mockMvc.perform(get("/sign-up"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(view().name("account/sign-up"));
    }
}

사실 이번에 MockMvc라는 것을 처음 써봤다. 아마 영어 해석 그대로하면 Mvc를 따라하여 코드를 테스트할 수 있는 것 같다. 검색해서 추가적인 정보를 알아봐야 할 것 같다.

위의 코드는 HTTP GET 요청을 보내고 정상적인 응답 상태코드가 오는지, 알맞은 뷰를 출력하는지 테스트하는 코드이다.

스프링 MockMvc에 대해 정리가 잘 된 글
조금 더 상세한 MockMvc 정리 (많은 메소드 등 포함)
추가적인 정리 Mock

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글