모르지 않다는 것은 아는것과 다르다.

전체 글 224

자바코드로 의존관게 주입하기

자바코드로 의존관계 주입 @Configuration public class MovieFactory { @Bean public MovieReader movieReader() { return new CsvMovieReader(); } // 메소드 콜 방식 @Bean public MovieFinder movieFinder() { return new MovieFinder(new movieReader) } // 메소드 파라미터 방식 @Bean public MovieFinder movieFinder(MovieReader movieReader) { return new MovieFinder(movieReader); } } 위와 같이 자바코드로 의존관계를 주입하는 방법은 크게 2가지이다. 첫번째 방법은 메소드 콜 방식이..

Spring 2022.03.10

상속 보다는 합성을 사용하라!

상속 위의 사진처럼 MovieFinder 라는 부모 클래스가 몇몇 기능의 구현을 자식클래스에게 위임한다. 상속을 사용하면 부모 클래스의 멤버를 재사용할 수 있는 장점이 있다. 또한 확장에 용이하다. 만약 요구사항으로 인해 구현체가 늘어났다고 해서 MovieFinder 가 변하지 않기 때문이다. 하지만, 상속은 캡슐화를 위배하고, 설계를 유연하지 못하게 만든다는 단점이 있다. 합성 합성은 다른 객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 재사용하는 방법을 의미한다. SOLID 원칙중 계방 폐쇄의 원칙(OCP) 을 만족할 수 있다. -> 소프트웨어는 객체는 확장에는 열려있고, 변경에는 닫혀 있어야 한다. MovieReader 를 통해서 자유롭게 확장할 수 있다. 또한 변경시 MovieFinder 는 변..

객체지향 2022.03.10

역할과 책임분리

책임 분리 public class MovieFinder { private MovieReader movieReader = new CsvMovieReader(); /** * 저장된 영화 목록에서 감독으로 영화를 검색한다. * * @param directedBy 감독 * @return 검색된 영화 목록 */ public List directedBy(String directedBy) { return movieReader.loadMovies() .stream() .filter(it -> it.getDirector().toLowerCase().contains(directedBy.toLowerCase())) .collect(Collectors.toList()); } /** * 저장된 영화 목록에서 개봉년도로 영화를 ..

객체지향 2022.03.10

Method Reference

Method Reference 기존에 이미 선언된 메소드를 지정하고 싶을 때 사용한다. :: 오퍼레이터를 사용한다. 생략되는 부분이 많기 때문에 사용할 메소드의 매개변수의 타입과 리턴 타입을 미리 숙지해야한다. Method Reference 의 4가지 케이스 ClassName::staticMethodName (클래스의 static Method 를 지정할 때) ObjectName::instanceMethodName (선언된 객체의 instance method 를 지정할 때) ClassName::instanceMethodName (객체의 instance method를 지정할 때) ClassName::new (클래스의 constructor를 지정할 때) ClassName::staticMethodName (클래..

Java 2022.03.06

디자인 패턴에 함수형 프로그래밍 적용하기

빌더 패턴 대표적인 생성 패턴이다. 객체의 생성에 대한 로직과 표현에 대한 로직을 분리해준다. 객체의 생성 과정을 유연하게 해준다. 객체의 생성 과정을 정의하고 싶거나 필드가 많아 constructor 가 복잡해질 때 유용하다. 아래와 같이 빌더 패턴을 구현할 수 있다. public class User { private int id; private String name; private String emailAddress; private boolean isVerified; private LocalDateTime createdAt; private List friendUserIds; public User(Builder builder) { this.id = builder.id; this.name = builde..

객체지향 2022.03.06

LazyEvaluation,Curry,IntStream

Lazy Evaluation Lambda의 계산은 그 결과값이 필요할 때가 되어서야 계산된다. 이를 이용하여 불필요한 계산을 줄이거나 해당 코드의 실행 순서를 Lazy Evaluation 의도적으로 미룰 수 있다. public class LazyEvaluation { public static void main(String[] args) { // 경우 1. if (or(returnTrue(), returnFalse())) { System.out.println("true"); } // 경우 2. if (lazyOr(() -> returnTrue(), () -> returnFalse())) { System.out.println("true"); } } public static boolean or(boolean ..

Java 2022.03.06

2021년 회고록

개요 개발을 시작한 지 거의 1년이 되어가는 시점에, 깃헙 블로그의 개시했던 글들과 TIL 로 정리했던 글들을 모아서 티스토리 블로그를 시작했다. 100개가 넘는 글들을 정리하면서 지난 1년 동안 내가 공부했던 내용들을 다시 한 번 리마인드할 수 있었고, 그 당시의 추억들도 떠올랐다. 그래서 나는 조금 늦었지만 2021년 회고록을 작성해 보려고 한다. 학교생활을 마무리 하며... 20살이 되어 성적에 맞춰서 과를 정한 것이 우연히 컴퓨터공학과였다. 대학교 생활을 하면서 많은 친구를 사귀고, 군 생활을 포함한 6년이 넘는 시간동안 개발자가 되고 싶다는 생각은 한 번도 해본 적이 없었다. 그렇기에 나는 2020년 12월 말, 대학교 생활을 마치고, 코딩테스트 공부와 영어공부를 했고, 대학교 생활을 하며 진행..

Diary 2022.03.01

JWT

JWT 란? JWT는 Json Web Token 의 약자이다. Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다. JWT는 아래와 같이 Header, Payload, Signature 으로 구성되어 있고, 3 부분을 . 구분자로 구분하며, Json 형태인 각 부분은 Base64로 인코딩 되어 표현된다. Base64는 암호화된 문자열이 아니고, 같은 문자열에 대해 항상 같은 인코딩 문자열을 반환한다. 세션 vs JWT 세션 방식 먼저 세션 방식으로 인증을 처리하는 과정은 아래와 같다. 위와 같이 먼저 클라이언트 측에서 로그인을 시도한다. 회원 정보가 일치하면 서버..

Spring Security 2022.02.28