본문 바로가기
반응형

분류 전체보기203

[Spring Security] Custom Login 만들기 Spring Security를 적용하고 따로 설정을 하지 않으면 자체적으로 제공하는 Login Form을 사용한다. 하지만 대부분의 서비스는 서비스에 알맞는 Login Form을 사용하고 싶어한다. Custom Login Page를 어떻게 제작하는지 간단하게 살펴보겠다. 순서는 아래와 같이 크게 3가지로 나뉜다. SecurityConfig 등록 formLogin설정 변경 logout설정 등록 1. SecurityConfig등록 SecurityConfig를 등록해준다. http.formLogin().loginPage(사용할 페이지) 로 설정해준다. 이때 주의할점이 .permitAll()을 꼭 설정해줘야한다. 로그인을 해야하는데 권한이 없어서 들어가지 못하는 상황이 발생할 수 있다. 로그인페이지를 커스텀하게.. 2020. 7. 12.
[enum] enum의 활용방법 JAVA를 처음 배울때 enum 부분을 보면서 이걸 어디다 써? 쓸데도 없어보이는데 왜 배우는거지? 라는 의문이 들것이다. (나는 들었다...) 실제로 취업을 하고나서 팀장님께서 사용하시기 전까지만해도 쓸모가 없는줄 알았다. 하지만 enum은 상태값을 관리할때 매우 강력하다. 말로만 쓴다면 모르니 예제를 통해 알아보도록 하자. USER의 정보를 가지는 테이블이 있다. USER라는 테이블은 아래와 같이 USER의 권한을 가지는 컬럼이 있다. 우리는 "1"은 유저 "2"는 유저라고 정하고 그 규칙을 맞춰서 코딩을 했다. public class Account { private String Role; public Account(String role) { Role = role; } } public final cl.. 2020. 7. 11.
[effective java 3/E] 제네릭 <로 타입은 사용하지 말라> 제네릭을 사용할 때 로 타입(raw type)은 절대 사용하면 안된다. 왜 사용하면 안되는지 알아보기 전에 로 타입이 무엇인지 모르시는분들을 위해 용어 설명을 먼저 하겠다. 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면 제네릭 클래스 or 제네릭 인터페이스라고 한다. 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭 타입이라고 한다. 각각의 제네릭 타입은 매개변수화 타입을 정의한다. ex) List 제네릭 타입을 하나 정의하면 그에 딸린 로 타입(raw type)도 함께 정의된다. 예를든다면 List를 정의하면 List가 함께 정의되는데 List가 List의 로 타입이다. 로 타입이 무엇인지 알아보았으니 이제 왜 사용하면 안되는지를 알아 보겠다. 오류는 가능한 한 컴파일 시점에 발견해야 한다. "로 .. 2020. 7. 11.
[effective java 3/E] 추상 클래스보다는 인터페이스를 우선하라. 이번 글을 읽기 위해서는 추상클래스와 인터페이스의 차이점을 알아야한다. 자바8 버전이전에 가장 큰 차이점은 추상 클래스는 구현부가 있는 메소드를 가질 수 있지만 인터페이스는 가질 수 없다는점이 제일 컸다. 자바8 버전에서 디폴트 메소드가 추가되면서 인터페이스도 구현부를 가질 수 있게 되었다. 그렇다면 우리는 여기서 세가지 의문을 가질 수 있다. 인터페이스와 추상클래스는 똑같지 않나요? 인터페이스와 추상클래스 어떤것이 더 좋은건가요? 인터페이스와 추상클래스 어떻게 사용하나요? 인터페이스와 추상클래스는 똑같지 않나요? 여전히 다릅니다. 자바는 다중상속이 안되기에 추상클래스를 사용하면 다른 상속을 받지 못합니다. 인터페이스를 사용한다면 여러개를 구현할 수 있습니다. 인터페이스는 변수는 public static.. 2020. 7. 8.
[effective java 3/E] 상속보다는 컴포지션을 사용하라 상속은 코드를 재사용할 수 있는 강력한 수단이지만 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다. 상속은 캡슐화를 깨뜨릴 수 있다. 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다는 말이다. 예를 한번 들어보도록 하겠다. 시나리오는 아래와 같다. 1. 우리에게는 HashSet 을 사용하는 프로그램이 있다. 2. HashSet은 처음 생성된 이후 원소가 몇 개 더해졌는지 알 수 있어야한다. 방법은 매우 간단하다. 몇개가 추가되었는지 알 수 있는 변수 1개와 추가되는 개수를 변수에 더해주기만 하면된다. 우리는 상속을 이용한다면 아래와 같이 작성할 수 있을것이다. package item18; import java.util.Collection; import java... 2020. 7. 5.
[effective java 3/E] equals는 일반 규약을 지켜 재정의하라. equals를 재정의 해야한다면 일반 규약을 지키면서 재정의하자!! equals를 재정의 하지않아도 될 때 아래의 상황 중 하나에 해당한다면 재정의 하지않아도 된다. 각 인스턴스가 본질적으로 고유할 때 논리적 동치성을 검사할일이 없을 때 상위 Class의 equals를 사용해도 문제 없을 때 Class가 private이거나 package-private이고 equals를 사용할일이 없을 때 equals를 재정의 해야할 때 논리적 동치성을 확인 해야하는데 상위 Class의 equals가 논리적 동치성을 비교하도록 재정의 되지 않았을 때 재정의 해야한다. equals를 재정의 할 때 지켜야 할 일반 규약 아래의 사항들을 지켜서 재정의 해야한다. 반사성 : null이 아닌 모든 참조 값 x에 대해, x.equa.. 2020. 7. 5.
[Spring] Security를 적용한채로 TEST 해보기 기존에 돌아가던 Test로직에 Spring Security를 입혀보기!! 모든 서비스에는 기본적으로 보안이 들어가야한다. 그래서 Spring Security를 적용해보기로 했다. 아래에는 잘 돌아가던 회원가입 테스트로직이다. 이제 Security를 추가해보자! @Test @DisplayName("회원가입 성공 테스트") void register() throws Exception { MemberDTO memberDTO = MemberDTO.builder() .userId("test") .password("123qwe") .email("test@naver.com") .certification("N") .build(); Set roles = new HashSet(); roles.add(UserRole.USER.. 2020. 6. 28.
[effective java 3/E] 자원을 직접 명시하지말고 의존 객체 주입을 사용하라 이게 무슨소리야? 조금 풀어서 말하면 클래스가 내부적으로 하나 이상의 자원에 의존한다면 이 자원들을 직접 만들게 해서는 안된다는 말이다. 그러면 자원은 어떻게 만들지? 라는 의문이 들것이다. 자원을 직접 생성하는것이 아닌 생성자(+ 빌더, 정적 팩토리 메소드)에 넘겨준다. 글로만 보아서는 이해가 어려울수도 있다. (필자가 그랬다...) 그래서 간단한 예제를 만들어 보았다. 시나리오 - 한국어 사전이 있다. - 한국어 맞춤법 검사를 지원한다. 위와같은 시나리오에서 클래스 내부에서 new 연산자를 이용하여 생성한다면 어떻게 코드를 작성하겠는가? 아마도 대부분 아래와 같이 작성할것이다. 한국어 사전.Class public class KoreaLexicon { public KoreaLexicon() { } } .. 2020. 6. 28.
[effective java 3/E] private 생성자나 열거타입으로 싱글턴임을 보증하라 싱글톤이란 ? 인스턴스를 오직 하나만 생성할 수 있는 클래스 new 연산자를 이용하여 SingTon 인스턴스를 생성한다면 1개를 만들면 1개 10개를 만들면 10개의 인스턴스가 생성될 것이다. 또한 생성할때마다 메모리에 추가될것이며 모두가 다른 인스턴스일것이다. 반면 싱글톤패턴이란 최초 실행할때 1회만 생성하며 이후부터는 만들어진 객체를 할당하여 사용하는 방식이다. 아래와 같은 SingTon 클래스가 있다고 가정해보자. 생성자를 private 으로 제한하고 유일하게 인스턴스에 접근할 수 있는 수단으로 public static 변수를 하나 생성한다. public class SingleTon { int firstValue = 0; public static final SingleTon SINGLE_TON = .. 2020. 6. 26.
[effective java 3/E] 생성자에 매개변수가 많다면 빌더를 고려하라 앞서 소개한 정적 팩터리와 생성자에는 똑같은 제약이 하나 있다. 선택적 매개변수가 많을 때 적절히 대응하기가 힘들다는 점이다. 아래와 같은 클래스가 있다고하자. 필드의 개수가 매우많다. public class ManyFieldClass { private int a; private int b; private int c; private int d; private int e; private int f; private int g; private int h; private int i; private int j; private int k; private int l; private int m; private int n; private int o; private int p; private int q; private i.. 2020. 6. 21.
[effective java 3/E] 생성자 대신 정적 팩터리 메서드를 고려해보자 클래스는 생성자와 별도로 정적 팩터리 메소드를 제공할 수 있다. 정적 팩터리 메소드란 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드를 일컫는다. 아래의 CustomBoolean Class 는 자바에 있는 Boolean 에서 설명에 필요한 부분만 발취해서 만든 간단한 클래스이다. 아래의 기본 생성자 CustomBoolean 은 boolean 필드에 값을 세팅해서 새로운 인스턴스를 만들어준다. 정적 메서드 valueOf는 기존에 만들어져있던 CustomBoolean 인스턴스를 반환해준다. public class CustomBoolean { public static final CustomBoolean TRUE = new CustomBoolean(true); public static final Custom.. 2020. 6. 21.
[node.js] 작업전에 JWT토큰 검증하기!! JWT란 ? Json 포맷을 이용하여 속성을 저장하는 Claim 기반의 Web Token 토큰 자체를 정보로 사용하는 Self-Contained방식 JWT를 알아보는 게시물이 아니므로 정의정도만 알아보도록 하겠습니다. JWT가 무엇인지 어떤용도로 사용되는지 궁금하신분은 google에 검색하면 많이 나옵니다. 작성할 로직 로그인에 성공하면 JWT토큰을 만들어서 사용자에게 반환한다 요청이 있을때 JWT토큰이 있는지, 있으면 유효한 토큰인지 검사후에 요청을 실행한다. 우선 jwt module이 필요합니다 npm i jsonwebtoken 을 실행해 jwt module을 설치하도록 합니다. 주요로직 설명 jsonwebtoken module을 사용하여 데이터부분, 시크릿키, 만료시간을 설정한다. const jwt.. 2020. 5. 30.