Back-End/Springboot와 AWS로 혼자 구현하는 웹 서비스 32

Chapter 05. 스프링 시큐리티와 OAuth 2.0으로 로그인 기능 구현하기 (2)

5.2 구글 서비스 등록 먼저 구글 서비스에 신규 서비스를 생성한다. 여기서 발급된 인증 정보(clientId와 clientSecret)를 통해서 로그인 기능과 소셜 서비스 기능을 사용할 수 있으니 무조건 발급받고 시작해야 함 구글 클라우드 플랫폼 주소 (http://console.cloud.google.com)로 이동한다. - 서비스에서 파라미터로 인증 정보를 주었을 때 인증이 성공하면 구글에서 리다이렉트할 URL - 스프링 부트 2 버전의 시큐리티에서는 기본적으로 {도메인}/login/oauth2/code/{소셜서비스코드}로 리다이렉트 URL을 지원하고있다. - 사용자가 별도로 리다이렉트 URL을 지원하는 Controller를 만들 필요가 없다. 시큐리티에서 이미 구현해 놓은 상태 - 현재는 개발 단..

Chapter 05. 스프링 시큐리티와 OAuth 2.0으로 로그인 기능 구현하기 (1)

스프링 시큐리티란? 막강한 인증과 인가(혹은 권한 부여) 기능을 가진 프레임워크 사실상 스프링 기반의 애플리케이션에서는 보안을 위한 표준 인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것을 권장 이번 장에서는 스프링 시큐리티와 OAuth 2.0을 구현한 구글 로그인을 연동하여 로그인 기능을 만들어 보겠다! 5.1 스프링 시큐리티와 스프링 시큐리티 Oauth2 클라이언트 많은 서비스에서 로그인 기능을 id/password 방식보다는 구글, 페이스북, 네이버 로그인과 같은 소셜 로그인 기능을 사용한다. 그 이유는 직접 구현할 경우 배보다 배꼽이 커지는 경우가 많기 때문이다. 직접 구현하면 다음을 전부 구현해야 한다. 로그인 시 보안 회원가입 시 이메일 혹은 전화번호 인증..

Chapter 04. 머스테치로 화면 구성하기 (5)

4.5 게시글 수정, 삭제 화면 만들기 게시글 수정 posts-update.mustache {{>layout/header}} 게시글 수정 글 번호 제목 작성자 내용 {{post.content}} 취소 수정 완료 삭제 {{>layout/footer}} ① {{post.id}} - 머스테치는 객체의 필드 접근 시 점(Dot)으로 구분 - 즉, Post 클래스의 id에 대한 접근은 post.id로 사용할 수 있다. ② readonly - input 태그에 읽기 기능만 허용하는 속성 - id와 author은 수정할 수 없도록 읽기만 허용하도록 추가 btn-update 버튼을 클릭하면 update 기능을 호출할 수 있게 index.js 파일에도 update function을 하나 추가한다. index.js var..

Chapter 04. 머스테치로 화면 구성하기 (4)

4.4 전체 조회 화면 만들기 index.mustache {{>layout/header}} 스프링 부트로 시작하는 웹 서비스 Ver.2 글 등록 게시글번호 제목 작성자 최종수정일 {{#posts}} {{id}} {{title}} {{author}} {{modifiedDate}} {{/posts}} {{>layout/footer}} ① {{#posts}} - posts라는 List를 순화 - Java의 for문과 동일하게 생각하면 됨 ② {{id}} 등의 {{변수명}} - List에서 뽑아낸 객체의 필드를 사용 여기서 머스테치의 문법이 처음으로 사용된다. PostsRepository.java package com.jojoldu.book.springboot.domain.posts; import org.spr..

Chapter 04. 머스테치로 화면 구성하기 (3)

4.3 게시글 등록 화면 만들기 오픈소스인 부트스트랩을 이용하자 부트스트랩, 제이쿼리 등 프론트엔드 라이브러리를 사용할 수 있는 방법은 크게 2가지 1. 외부 CDN을 사용 2. 직접 라이브러리를 받아서 사용 1번을 사용할 것임. layout/header}} // ① 스프링 부트로 시작하는 웹 서비스 Ver.2 글 등록 {{>layout/footer}} ① {{>layer/header}} - {{>}}는 현재 머스테치 파일(index.mustache)을 기준으로 다른 파일을 가져옴 태그를 이용해 글 등록 페이지로 이동하는 글 등록 버튼이 생성됨 이동할 페이지 주소는 /posts/save 페이지에 관련된 컨트롤러는 모두 IndexController를 사용 IndexController @RequiredArg..

Chapter 04. 머스테치로 화면 구성하기 (2)

4.2 기본 페이지 만들기 먼저 스프링 부트 프로젝트에서 머스테치를 편하게 사용할 수 있도록 머스테치 스타터 의존성을 build.gradle에 등록 compile('org.springframework.boot:spring-boot-starter-mustache') 머스테치 : 스프링 부트에서 공식 지원하는 템플릿 엔진이다. 머스테치 파일 위치는 기본적으로 위의 위치에 둔다. -> 스프링 부트에서 자동으로 로딩함. 첫 페이지를 담당할 index.mustache를 templates 폴더를 생성해 넣어두기 index.mustache 스프링 부트로 시작하는 웹 서비스 이 머스테치에 URL을 매핑. URL 매핑은 당연하게 Controller에서 진행 -> web 패키지 안에 IndexController를 생성함 ..

Chapter 04. 머스테치로 화면 구성하기 (1)

4.1 서버 템플릿 엔진과 머스테치 소개 템플릿 엔진이란, 지정된 템플릿 양식과 데이터가 합쳐져 HTML 문서를 출력하는 소프트웨어를 이야기. JSP, Freemarker -> 서버 템플릿 엔지니어 React, 뷰의 View 파일들 -> 클라이언트 템플릿 엔지니어 둘 모두 결과적으로 지정된 템플릿과 데이터를 이용하여 HTML을 생성하는 템플릿 엔진이지만 차이가 있음 ex) 자바스크립트에서 JSP나 Freemarker처럼 자바 코드를 사용할 순 없나요? $(document).ready(function(){ if(a=="1"){ } }); 이 코드는 if문과 관계없이 무조건 test를 콘솔에 출력함 -> 그 이유는 프론트엔드의 자바스크립트가 작동하는 영역과 JSP가 작동하는 영역이 다르기 때문인데 JSP를 ..

Chapter 03. SpringBoot에서 JPA로 데이터베이스 다뤄보자 (5)

3.5 JPA Auditing으로 생성시간/수정시간 자동화하기 보통 엔티티에는 해당 데이터의 생성시간과 수정시간을 포함 언제 만들어졌는지, 언제 수정되었는지 등은 유지보수에 있어 굉장히 중요한 정보이기 때문 그렇다 보니 매번 DB에 삽입하기 전, 갱신하기 전에 날짜 데이터를 등록/수정하는 코드가 여기저기 들어가게 됨 // 생성일 추가 코드 예제 public void savePosts(){ ... posts.setCreateDate(new LocalDate()); postsRepository.save(posts); ... } 이런 단순하고 반복적인 코드가 모든 테이블과 서비스 메소드에 포함되어야 한다고 생각하면 어마어마하게 귀찮고 코드가 지저분해짐 -> 해결책으로 JPA Auditing을 사용 LocalD..

Chapter 03. SpringBoot에서 JPA로 데이터베이스 다뤄보자 (4)

3.4 등록/수정/조회 API 만들기 API를 만들기 위해 총 3개의 클래스가 필요 Request 데이터를 받을 Dto API 요청을 받을 Controller 트랙잭션, 도메인 기능 간의 순서를 보장하는 Service (1) Web Layer 흔히 사용하는 컨트롤러(@Controller)와 JSP/Freemarker 등의 뷰 템플릿 영역 이 외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 외부 요청과 응답에 대한 전반적인 영역을 야기 (2) Service Layer @Service에 사용되는 서비스 영역 일반적으로 Controller와 Dao의 중간 영역에서 사용 @Transactional이 사용되어야 하는 영역 (3) Repository Layer Da..

Chapter 03. SpringBoot에서 JPA로 데이터베이스 다뤄보자 (3)

3.3 Spring Data JPA 테스트 코드 작성하기 1. test 디렉토리에 domain.posts 패키지를 생성하고, 테스트 클래스는 PostsRepositoryTest란 이름으로 생성 PostsRepositoryTest에서는 다음과 같이 save, findAll 기능을 테스트한다. package com.jojoldu.book.springboot.domain.posts; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.conte..