저자의 깃허브 주소: https://github.com/jojoldu/freelec-springboot2-webservice
개발의 큰 흐름을 파악하는데 큰 도움이 되었다.
물론 Spring Security 은 내부 구조는 어렵다...
책에서 얻을 수 있었던 지식들을 정리해본다.
# 개발의 큰 흐름 파악
- 도메인과 레포지토리부터 개발 (Posts 도메인과 스프링 데이터 jpa 사용)
- 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. customOAuth2UserService 는 OAuth2UserService<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. 로그 아웃
# 영상
'Spring' 카테고리의 다른 글
[일지] Static 메서드로 생성하는 객체가 자동으로 save?? (0) | 2020.09.01 |
---|---|
[일지] TestRestTemplate 로 테스트 하면서 궁금했던 점(feat :NoSuchBeanDefinitionException) (0) | 2020.09.01 |
[일지] JPA Auditing 안먹는 이유는? (0) | 2020.08.25 |
[일지] failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. (0) | 2020.08.25 |
[Spring] 초간단 웹 어플리케이션 구현 (0) | 2020.07.28 |
댓글