본문 바로가기
Spring

[후기] 스프링 부트와 AWS로 혼자 구현하는 웹서비스

by onejunu 2020. 8. 29.

저자의 깃허브 주소: https://github.com/jojoldu/freelec-springboot2-webservice

 

jojoldu/freelec-springboot2-webservice

Contribute to jojoldu/freelec-springboot2-webservice development by creating an account on GitHub.

github.com

 

개발의 큰 흐름을 파악하는데 큰 도움이 되었다.

 

물론 Spring Security 은 내부 구조는 어렵다...

 

책에서 얻을 수 있었던 지식들을 정리해본다.

# 개발의 큰 흐름 파악

 

  1. 도메인과 레포지토리부터 개발 (Posts 도메인과 스프링 데이터 jpa 사용)
  2. api 개발

2-1. 도메인에 비즈니스 로직을 처리

2-2. 서비스계층은 트랜잭션과 도메인 간의 순서만 보장하는 역할

2-3. request DTO 작성

2-4. 컨트롤러 작성
2-5. 테스트 코드 작성 ( @WebMvcTest 는 JPA 작동 안하기 때문에 (@SpringBootTest + TestRestTemplate) 조합으로 사용)

2-6. Auditing 적용

 

3. 머스테치로 화면 구성

 3-1. js/css 선언 위치에 따라 로딩 속도가 다르다. css 는 헤더에 js는 바디 맨 마지막에 배치.

 3-2. js 객체를 이용해 전역 변수 충돌 문제 회피

 

4. 스프링 시큐리티와 OAuth 2.0 로그인 구현

 4-1. 스프링 부트 2.0 은 client id 와 clientSecret 정보만 있으면 서비스를 이용할 수 있음.

        이유는 CommonOAuth2Provider 라는 enum이 추가되어 builder를 통해 기본 설정값 제공함.

 4-2. spring.profiles.include=oauth  // 이렇게 하면 application-oauth.properties 를 포함할 수 있음.

 4-3. 승인된 리디렉션 URI = 서비스에서 파라미터로 인증 정보를 주었을 때 인증이 성공하면 구글에서 리다이렉트할 URL

                  =  스프링 부트 2.0에서 "{도메인}/login/oauth2/code/{소셜 서비스코드}" 를 이미 구현해서 Controller를 구현할 필요 없음.

 4-4. 스프링 시큐리티 관련 의존성

compile('org.springframwork.boot:spring-boot-starter-oauth2-client')

 4-5. WebSecurityConfigurerAdapter 를 상속받는 SecurityConfig 클래스 작성. @EnableWebSecurity  어노테이션을  추가해야 적용이 됨.

 

 4-6. SecuriyConfig 클래스 전체 로직

@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final CustomOAuth2UserService customOAuth2UserService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                    .csrf().disable()
                    .headers().frameOptions().disable()  // (1)
                .and()
                    .authorizeRequests()
                    .antMatchers("/","/css/**","/images/**","/js/**","/h2-console/**","/profile").permitAll()
                    .antMatchers("/api/v1/**").hasRole(Role.USER.name())
                    .anyRequest().authenticated() // (2)
                .and()
                    .logout()
                        .logoutSuccessUrl("/") // (3)
                .and()
                    .oauth2Login()
                        .userInfoEndpoint()
                            .userService(customOAuth2UserService); // (4)


    }
}

 

(1) csrf 와 framOptions 를 disable

(2) url 구간 별로 권한 설정

(3) 로그아웃 설정

(4) oauth2 로그인에 성공했을 때 사용자 정보를 어떻게 가져올 것인지? UserService의 구현체를 등록하여 가져온 사용자의 정보를 처리함.

 

 4-7. customOAuth2UserServiceOAuth2UserService<OAuth2UserRequest,OAuth2User> 를 implements 하여  가입 및 정보 수정, 세션 저장을 기능을 제공.

 4-8. 세션 저장은 데이터베이스를 이용함.

 4-9. ArgumentResolver 로그인 세션 정보를 가져옴.

 

5. github 에 푸시하면 travis CI 에서 감지하여 jar 를 AWS S3 저장소에 전달하고 AWS CodeDeploy에 배포 요청을 함.

    AWS S3 에서 CodeDeploy 에 jar 전달하면 ec2에 배포함. 

 

6. ec2 인스턴스 내부는 nginx로 port 번호 8081 과 8082 2개중 하나를 가리키고 있으며 사용자 입장에서는 24시간 내내 이용할 수 있다.

    nginx 관련하여 배포 스크립트 작성도 연습 해야함.

 

 

 

# 책의 흐름

 

왜 이러한 기술을 선택했는지 잘 알려준다. 개인적으로 마음에 드는 부분이다. 또한 설명의 깊이가 낮고 기술에 대해 굉장히 추상화해서 잘 설명한다. 따라서 입문자들이 접하기에 적당하다. 하지만 이 또한 흐름을 이해하기 위해서는 전반적인 Network 지식과 Java에 대한 지식 그리고 데이터베이스의 기본은 있어야 나중에 구글링을 통해서든 이해할 수 있다. 다만 Java만 알고 바로 시작한다면 따라는 할 수 있겠지만 이해하기에는 상당히 더딜 수 있을 것이다. 그래도 일단 만들어 보고 이해하는 것이 개발 공부에서는 제일 좋은 거 같다.

 

 

# 최종 결과 화면

 

1. 메인 화면

 

2. 방명록 등록하기 누르면 로그인 화면으로 이동함.

 

 

3. 구글로 로그인하기 누르면 아래처럼 나옴.

 

 

4. 게시글 등록

5. 등록된 화면

 

6. 제목 입력시 수정

7. 수정된 화면

 

8. 글 삭제

9. 로그 아웃

 

 

 

# 영상

 

 

댓글