분류 전체보기 187

사용자 인증 방식 (쿠키, 세션, 토큰)

웹 애플리케이션에서 사용자 로그인을 구현할 때, 사용자의 로그인 상태를 구별해야 한다. HTTP는 상태를 저장하지 않는 속성(Stateless)을 갖기 때문에 사용자의 로그인 상태를 구별할 수 없다. 그렇기 때문에, 쿠키, 세션, 토큰을 사용해 사용자 상태를 구별할 수 있도록 돕는다. 쿠키 (Cookie) 쿠키는 클라이언트와 서버 간의 통신에서 주고 받는 대화 수단이라고 볼 수 있다. 서버와 클라이언트의 연결 시 쿠키가 생성되어 브라우저(클라이언트)를 통해 관리된다. 쿠키에는 이름, 값, 만료 날짜, 경로 정보 등이 담겨있다. 호스트 별로 쿠키가 생성되기 때문에 사용자의 정보를 구별할 수 있지만 서버에서 따로 인증 과정이 없기 때문에 쿠키만으로 사용자를 인증하고 구별하는 것은 어렵다. 때문에 세션(Ses..

Anything 2021.07.19

[Spring] MockMvc 테스트에서 Model 전달

질문 상세 페이지를 테스트할 때, 컨트롤러에서는 질문의 내용을 모델에 담아 전달해 템플릿 엔진을 통해 출력했다. 테스트 코드에서 모델에 담아 전달할 방법이 어떻게 되는지 찾아봤는데, Model을 선언하고 넘길 수 있는 코드는 보이지 않았다. 생성된 객체를 전달하기 질문을 생성하고 질문의 상세 페이지를 접근하는 테스트코드를 작성할 때, 먼저, get을 통해 URI를 설정하고 접근할 것이다. 이 때, 생성된 질문을 전달해주기 위해서 flashAttr() 메서드를 사용한다. flashAttr() 메서드에 객체 이름과 생성된 객체를 전달해준다. mockMvc.perform(MockMvcRequestBuilders .get(String.format("/questions/%d", newQuestion.getId()..

Java/Spring 2021.07.13

테스트 코드

Spring boot로 게시판 웹 프로젝트를 진행하고 있다. Spring-Boot, JPA로 질문/답변 게시판 구현 과정 이 과정 진행 방식과 반복주기에 대한 설명은 https://goo.gl/CJToI6 에서 참고할 수 있다. www.youtube.com 복습을 통해 만드는 과정을 반복하면서 이제 영상 없이 게시판 웹을 제작할 수 있게 되었다. 정말 유익하고 너무나 감사합니다. 하지만 앞으로 배울 것이 더 많음을 느낀다. 프로젝트 구성 영상에서는 컨트롤러와 리포지토리를 통해 프로젝트를 구현했는데, 구글에서 찾아보니 이젠 컨트롤러와 서비스, 리포지토리로 프로젝트를 구현한다고 한다. 내가 이해하기로는 컨트롤러는 요청과 응답에 대해 책임을 갖고 서비스는 요청에 따른 비지니스 로직을 담당한다. (컨트롤러와 리..

Journal 2021.07.12

[Spring] Test 코드에서 session 전달하기

스프링 웹 프로젝트에서 세션 기반의 로그인을 구현하고, 로그인한 회원에게만 질문 등록과 같은 특정한 기능을 제공하도록 로직을 구현했다. 세션은 HttpSession 객체를 파라미터로 전달하는데 테스트 상황에서는 적용되지 않았다. 테스트 코드에서 세션 사용 테스트 코드에서 Session을 사용하는 방식은 MockHttpSession을 통해 세션을 사용한다. MockHttpSession session = new MockHttpSession(); 사용방식은 기존의 세션과 동일하게 setAttribute(), getAttribute()와 같은 메서드를 활용할 수 있다. 이제, 생성된 세션에서 유저정보를 불어오는 것은 getAttribute 메서드를 통해 가져올 수 있다. 그렇다면, Controller에서 세션 ..

Java/Spring 2021.07.12

Spring Boot JPA에서 LocalDateTime 처리

Entity 내에서 시간에 대한 처리를 LocalDateTime으로 처리할 때, DB에서는 Timestamp 타입이 아닌 Binary 타입으로 저장된다. 이를 timestamp 타입으로 저장하려면 Converter 객체를 사용한다. 아래 코드로 Converter 객체를 생성한다. package com.scene.board; import javax.persistence.AttributeConverter; import javax.persistence.Converter; import java.sql.Timestamp; import java.time.LocalDateTime; @Converter(autoApply = true) public class LocalDateTimeConverter implements ..

Anything 2021.07.10

DAO와 Repository의 차이

스프링 부트 프로젝트를 진행하면서, Database와 같은 영구 저장소에 대해 참조할 때, DAO라는 표현과 Repository라는 표현이 혼용되거나 혹은 다른 개념으로 설명하는 경우가 있어 정리하고자 한다. DAO DAO는 Data Access Object로 실제 영구저장소에 접근하는 객체다. 문제점 3가지 1) 구현체와 로직이 너무 강한 결합 (MySQL -> Oracle DB 변경하려면....? 수정되는 로직..) 2) 서비스 레이어와 도메인, 인프라 레이어가 결합됨. 3) 개발자 러닝커브 증가 이를 해결하기 위해 DAO 패턴 사용 (어댑터 패턴), DTO를 사용. 도메인에 정의된 Table. DAO로 DB에 접근, 결과 값을 DTO에 담아 리턴한다? Repository Repository는 객체 ..

Anything 2021.07.09

AWS에서 Spring boot 프로젝트 로그인 시간 오래 걸림

Spring boot 프로젝트를 AWS에 배포하고 로그인을 시도할 때 로컬에서와 다르게 시간이 아주 오래걸리고, Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [371,575] milliseconds. 위와 같은 에러 메시지를 볼 수 있음. 문제점 이에 대한 문제는 리눅스 서버의 난수 생성 방식에 대한 문제였다. 자바에서 커넥션을 생성할 때 난수 생성이 필요하다. 기본적으로 /dev/random을 통해 난수를 생성한다. /dev/random은 사용자의 입력 신호가 비트의 형태로 저장되어 난수를 생성할 때 사용하는데, 여기서 문제가 저장된 비트의 size가 충분하지 않으면 /dev/random을 사용하지 않..

Anything 2021.07.08

Mustache에서 세션 값 노출 설정

Session을 통해 로그인을 구현할 경우 Session 값을 확인해 Mustache 템플릿 엔진에 if문과 같은 처리를 할 수 있다. 기본적으로 Mustache에서 if문을 사용하는 방식은 {{#isTrue}} 참일 경우 넣을 것 {{/isTrue}} {{^isTrue}} 거짓을 경우 넣을 것 {{/isTrue}} 와 같이 사용하게 된다. 이 때, 기본적으로 세션 값이 노출되지 않도록 되어있기 때문에 설정이 필요하다. spring.mustache.expose-session-attributes=true application.properties에 위와 같은 설정을 추가해야 한다.

Anything 2021.07.07

Spring 로그인 수동 테스트시 회원가입 반복 작업 최소화

Spring boot 프로젝트에서 로그인 기능을 구현할 때, H2와 같은 메모리 DB를 사용할 경우 특성상 서버가 종료되고 다시 실행되면 DB 내에 회원 정보가 초기화된다. 이 때, 서버를 종료하고 다시 수동 테스트를 할 때마다 회원가입을 통해 DB에 회원정보를 넣는 것을 반복해야하는 문제가 발생한다. Spring boot 공식 문서를 확인해보면, Initialize a Database Using Hibernate라는 부분이 있다. 문서 하위에, In addition, a file named import.sql in the root of the classpath is executed on startup if Hibernate creates the schema from scratch. 클래스패스의 루트 위..

Anything 2021.07.06

[Algorithm] 프로그래머스 디스크 컨트롤러

코딩테스트 연습 - 디스크 컨트롤러 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를 programmers.co.kr 풀이 1. 실행이 가능한 작업 중에서 소요 시간이 적은 작업부터 진행한다. 2. 실행이 가능하지 않은 작업은 작업 시작 시간 순으로 정렬하고 꺼내 실행 가능한 작업으로 보낸다. 위의 조건을 맞추기 위해, 작업 시작 시간과 작업 소요 시간을 멤버변수로 갖는 Work 객체를 생성한다. 그리고 각각의 조건으로 정렬되고, 앞에서부터 꺼내서 사용할 수 있는 우선순위 큐를 사용한다. 작업 목록에 모든 작업을 저장한다. 먼저 현재 시간 0초부터 시작한다. 작업 목록에서..

Algorithm 2021.07.05
반응형