전체 글

저의 지식이 세상에 가치를 더하길 바라는 백엔드 지망생입니다.
· Dev Book
[ 싱글톤(Singleton)이란 ] 싱글톤은 인스턴스가 오직 하나만 생성 될 수 있는 클래스를 말한다. 싱글톤은 무상태로 유지되야 하며 우리가 가장 많이 접할 수 있는 싱글톤으로는 스프링 컨테이너에서 빈을 싱글톤으로 관리하는게 있다. [ 싱글톤을 만드는 방식 ] 싱글톤을 만드는 방식은 보통 두가지 중 하나이다. public static final로 싱글톤 객체를 만드는 방식 public static 메서드로 싱글톤 객체를 반환하는 방식 두 방식 모두 private 생성자를 통해 외부에서 인스턴스 생성이 불가능하게 하고, static으로 싱글톤 객체가 프로그램 로딩 시 미리 만들어지게 한다. [ public static final로 싱글톤 객체 생성 ] public class Elvis { public ..
· Dev Book
정적 팩터리와 생성자를 통한 객체 생성은 선택적 매개변수의 수가 많을때 제약이 있다. public class NutritionFacts { private final int servingSize; // 필수 private final int servings; // 필수 private final int calories; // 선택 private final int fat; // 선택 .... } 선택적 매개변수란 위의 NutritionFacts를 생성할때 꼭 필요하지 않은 변수를 말한다. 예를 들어 calories와 fat이 영양 정보를 표시하는데 꼭 필요한 정보가 아니라면, 당장 생성자를 통해 초기화 해주지 않아도 된다. 이런 상황에서 대처할 수 있는 방법들을 알아보자. [ 대안 1. 점층적 생성자 패턴 ] ..
📌 김영한님의 강의를 바탕으로 정리한 글입니다. [ @Aspect란? ] 스프링 어플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성된 어드바이저를 스프링 빈으로 등록해야 한다. 자동 프록시 생성기는 스프링 컨테이너에서 어드바이저를 찾아서 나머지 스프링 빈들에 프록시를 자동으로 적용해준다. 스프링은 @Aspect 라는 어노테이션을 사용해서 어드바이져를 쉽게 만들수 있게 해준다. @Aspect는 AspectJ 프로젝트에서 제공해주는 어노테이션이다. 하지만 AspectJ 프로젝트 자체를 사용하는것은 아니다. 스프링은 AspectJ의 기능을 차용해서 사용하는 것이다. @Aspect를 사용하는 방법을 살펴보자 @Component @Aspect // 해당 클래스를 어드바이져로 만들 수 있게 해준다. @S..
스프링 타입 컨버터란? HTTP 쿼리스트링을 통해 전해지는 모든것은 문자로 인식된다. 하지만 localhost:8080/test?itemId=10 처럼 쿼리스트링을 보냈을때, 컨트롤러에서는 Long itemId의 숫자 타입으로 입력받을 수 있다. 이처럼 형변환이 되려면 매개변수를 처리하는 과정에서 자동으로 호출되는 변환 기능이 있어야 한다. 이것이 스프링 타입 컨버터이다. 스프링 타입 컨버터의 아래의 어노테이션을 대상으로 사용 가능하다. - @RequestParam - @ModelAttribute - @PathVariable 스프링 타입 컨버터 사용 스프링 타입 컨버터는 Converter라는 인터페이스를 구현해서 사용할 수 있다. Converter 형태에서 S는 입력값의 형태를, T에는 변환하길 원하는 ..
최근 스트림 API에 대해 집중적으로 공부하는 와중에 map과 flatMap의 차이점을 더 자세히 정리하고 싶어서 포스팅을 하게 되었습니다. Map이란? map은 스트림 내부의 요소 하나하나에 접근해서 제가 파라미터로 넣어준 함수를 실행한 뒤 최종연산에서 지정한 형식으로 반환해주는 메서드 입니다. List people = Arrays.asList( new Person("personA", 24), new Person("personB", 26), new Person("personC", 28), new Person("personD", 30) ); 위와 같은 리스트를 예시로 만들어보겠습니다. List nameList = people.stream() .map(person -> person.getName()) .c..
· Spring/JPA
문제 JPA를 사용하면서 서로 다른 엔티티를 save할때 id값이 엔티티 별로 나누어지지 않고 합쳐서 올라가는 경험을 한 적이 있을 것이다. commentRepository.save(new Comment()); memberRepository.save(new Member()); 예를 들어 위의 코드를 실행하면 이렇게 엔티티별로 id가 분리되지 않고 함께 증가하는걸 알 수 있다. @GeneratedValue를 사용하면 default값으로 AUTO가 적용되고, AUTO는 IDENTITY를 기본으로 사용한다고 알고 있었는데, 실제로 적용되는 전략은 IDENTITY가 아니였던 것이다. 실제 어떤 전략이 적용되었는지 확인해보면, 사진에서 볼 수 있듯이 테이블 시퀸스가 적용된것을 알 수 있다. 테이블 시퀸스 전략이란..
람다 표현식이란? 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 람다 표현식은 함수형 인터페이스를 구현하는 방법으로만 사용 가능하다. 함수형 인터페이스 public Interface Runnable { void run(); } 위의 Runnable 인터페이스와 같이 인터페이스 내에 추상 메서드가 딱 하나 있을때 함수형 인터페이스라고 부른다. 자바에서는 다양한 함수형 인터페이스를 제공해준다. 대표적인 함수형 인터페이스들을 구현해보았다. 1. void -> void Runnable r = () -> System.out.println("runnable!") r.run() 2. void -> T Supplier supplier = () -> "hello".toUpperCas..
· Dev Book
주석을 추가하는 이유? 우리의 코드 품질이 나쁘기 때문이다! 주석이 없이도 충분한 설명이 되는 코드가 좋은 코드이다. 주석은 코드와 다르게 한번 작성하고 나면 방치될 수 있다. 처음에는 코드를 잘 설명했지만 시간이 지날수록 거짓된 정보를 제공할 가능성이 있다. 좋은 주석이란? 구현에 대한 정보를 제공 : 정규표현식의 경우에는 한번에 이해하기 어렵다. 주석으로 자세히 설명을 달아주자 의도와 중요성을 설명하는 주석 TODO , FIXME TODO는 미래에 작성해야 하는 코드에 대한 설명을 적는다. FIXME는 문제가 되지만 당장은 고치지 않는 코드를 적는다. 📚 JavaDocs 현업에서 타 부서에게 코드를 보여준다면 JavaDocs로 자세한 설명을 달아놓는것이 좋다.
Jemlog
깊게 자라기