Java/스프링부트와 AWS로 혼자 구현하는 웹 서비스 10

JPA Auditing

Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터베이스 테이블에 매핑할 때 공통적으로 도메인들이 가지고 있는 필드나 컬럼들이 존재합니다. (ex. 생성일, 수정일 등) 데이터베이스에서 누가, 언제 그 일을 했는지 기록을 잘 해야 합니다. 그래서 공통적으로 도메인들이 가지고 있는 필드나 컬럼은 중요한 데이터입니다. 그래서 JPA에서는 Audit이라는 기능을 제공하고 있습니다. Audit은 '감시하다'라는 뜻으로 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능입니다. 도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 업데이트를 하는 경우 매번 시간 데이터를 입력하여 주어야 하는데, audit을 이용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주..

세션 저장소로 데이터베이스 사용

현업에서 세션 저장소에 대해 3가지 중 한 가지를 선택하는데 1. 톰캣 세션을 사용 - 별다른 설정 없을 때 기본적으로 선택되는 방식 - 2대 이상의 WAS가 구동되는 환경에서는 톰캣들 간의 세션 공유를 위한 추가 설정이 필요 2. MySQL과 같은 데이터베이스를 세션 저장소로 사용 - 여러 WAS 간의 공용 세션을 사용할 수 있는 가장 쉬운 방법 - 많은 설정 필요 없지만, 로그인 요청마다 DB IO가 발생하여 성능상 이슈가 발생할 수 있다. 3. Redis, Memcached와 같은 메모리 DB를 세션 저장소로 사용 - B2C 서비스에서 가장 많이 사용 2번을 사용하려면 spring-session-jdbc 등록을 해야 한다. build.gradle에 compile('org.springframework..

SessionUser

세션에 사용자 정보를 저장하기 위한 Dto 클래스 -> 왜 User 클래스 쓰지 않고 새로 만들어서 쓰는지? - User 클래스를 세션에 저장하려면 User 클래스에 직렬화를 구현하지 않았다는 의미의 에러가 뜬다. 그렇다고 오류를 해결하기 위해 User 클래스를 넣기에는 User 클래스가 엔티티이기 때문에 언제 다른 엔티티와 관계가 형성될지 모른다. 즉, @OneToMany, @ManyToMany 등 자식 엔티티를 갖고 있다면 직렬화 대상에 자식들까지 포함되서 성능 이슈, 부수 효과가 발생할 확률이 높다. 그래서 직렬화 기능을 가진 세션 Dto를 하나 추가로 만드는 것이 이후 운영 및 유지보수 때 도움이 많이 된다.

스프링 시큐리티와 OAuth 2.0으로 로그인 기능 구현

로그인을 직접 구현할 때 - 로그인 시 보안 - 비밀번호 찾기 - 비밀번호 변경 - 회원가입 시 이메일 혹은 전화번호 인증 - 회원정보 변경 하지만 OAuth 로그인 구현 시 위의 목록의 것들을 모두 구글, 페이스북, 네이버 등에 맡기면 된다. 구글 서비스 등록 https://console.cloud.google.com Google Cloud Platform 하나의 계정으로 모든 Google 서비스를 Google Cloud Platform을 사용하려면 로그인하세요. accounts.google.com [프로젝트 선택] - [새 프로젝트] [API 및 서비스] - [대시보드] - [사용자 인증 정보] - [사용자 인증 정보 만들기] - [OAuth 클라이언트 ID 만들기] [동의 화면 구성] - [앱 이름..

브라우저의 스코프

src/main/resources/static/js/app/index.js var init = function() { ~ }; var save = function() { ~ }; init(); index.js의 첫 문장에 var main = { ~ }라는 코드를 선언했는데 굳이 index라는 변수의 속성으로 function을 추가한 이유가 뭘까? 예를 들어 index.mustache에서 a.js가 추가되어 a.js도 a.js만의 init과 save function이 있다해도 브라우저의 스코프는 공용 공간으로 쓰이기 때문에 나중에 로딩된 js의 init, save가 먼저 로딩된 js의 function을 덮어쓰게 된다. 여러 사람이 참여하는 프로젝트에서 중복된 함수 이름은 자주 발생할 수 있다. 그러다 보니..

머스테치

템플릿 엔진 - 지정된 템플릿 양식과 데이터가 합쳐져 HTML 문서를 출력하는 소프트웨어 예전에 Jsp, Freemaker 등(서버 템플릿 엔진) 요즘은 리액트, 뷰의 View 파일(클라이언트 템플릿 엔진) -> 모두 결과적으로 지정된 템플릿과 데이터를 이용하여 HTML을 생성하는 템플릿 엔진 $(document).ready(function(){ if(a=="1"){ % } }); 이 코드는 if문과 관계없이 무조건 test를 콘솔에 출력하는데 이유는 프론트엔드의 자바스크립트가 작동하는 영역과 JSP가 작동하는 영역이 다르기 때문인데 JSP를 비롯한 서버 템플릿 엔진은 서버에서 구동된다. 서버 템플릿 엔진을 이용한 화면 생성은 서버에서 Java 코드로 문자열을 만든 뒤 이 문자열을 HTML로 변환하여 브..

API

API를 만들기 위해 총 3개의 클래스가 필요한데 · Request 데이터를 받을 Dto · API 요청을 받을 Controller · 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service · Web Layer - Controller, JSP/Freemarker 등의 뷰 템플릿 영역 - 이외에도 필터, 인터셉터, 컨트롤러 어드바이스 등 외부 요청과 응답에 대한 전반적인 영역 · Service Layer - @Service에 사용되는 서비스 영역 - 일반적으로 Controller와 Dao의 중간 영역에서 사용 - @Transactional이 사용되어야 하는 영역이기도 함 · Repository Layer - 데이터베이스와 같이 데이터 저장소에 접근하는 영역 · Dtos - Dtos는 Dto들의 영역이..

JPA

JPA - 자바 표준 ORM * ORM(Object Relational Mapping, 객체 관계 매핑) : 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것 객체를 관계형 데이터베이스에서 관리하는 것이 무엇보다 중요한다. 1. 그런 과정에서 SQL문이 계속 반복될 수 있는데 반복되는 문제가 있다. 2. 관계형 데이터베이스와 객체지향 프로그래밍 언어의 패러다임이 서로 다른데, 객체를 데이터베이스에 저장하려고 하니 발생하는 문제가 패러다임 불일치이다. JPA는 이런 문제점들을 해결하기 위해 등장했는데 객체지향 프로그래밍 언어와 관계형 데이터베이스를 중간에서 패러다임 일치를 시켜주기 위한 기술이다. 즉, 개발자가 객체지향적으로 프로그래밍을 하고, JPA가 이를 관계형 데이터베이스에 맞게 S..

스프링 기초

Spring : Java 언어를 바탕으로 서버를 담당, 요청에 따라서 눈에 보이는 것들 or 데이터를 제공해준다. - 자바의 클래스 중 private 정보 가져오려면 -> getter 사용 - 데이터로 응답하려면 RestController 사용 - Rest : 서버의 응답이 JSON 형식임을 나타냄 - Controller : 클라이언트의 요청을 전달 받는 예 - RestController : JSON만을 돌려주는 것 - Controller 클래스를 만들고 위의 역할을 하는 것을 Spring에게 알려주기 위해 @RestController라고 어노테이션(주석)해준다. - @GetMapping('주소') : 해당 주소일 경우 GET 메소드가 실행된다고 보면 된다. - Gradle : 다른 사람들이 만든 도구들..

테스트 코드

최근 추세는 대부분의 서비스 회사가 테스트 코드에 관해 요구한다. 흔히 채용 정보 우대사항을 보면 빌드/테스트/배포 자동화 경험이 있는 사람을 뽑는다. 먼저 TDD와 단위 테스트는 다른 내용인데 TDD는 테스트가 주도하는 개발이고 테스트 코드를 먼저 작성하는 것부터 시작한다. 반면, 단위 테스트는 TDD의 첫 번째 단계인 기능 단위의 테스트 코드를 작성하는 것을 말한다. TDD와 달리 테스트 코드를 꼭 먼저 작성해야 하는 것도 아니고, 리팩토링도 포함되지 않는 순수하게 테스트 코드만 작성하는 것을 말한다. 테스트코드는 왜 작성해야 하는가? - 단위 테스트는 개발단계 초기에 문제를 발견하게 도와준다. - 단위 테스트는 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지..