빌더를 사용하는 장점은 무엇인가? 1. setter 방식의 단점 기존의 자주 사용하던 자바빈즈 패턴(= setter) 의 경우, 객체 하나를 만드려면 여러개의 메서드를 호출해야 하고, 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다. (=객체의 불변성이 깨진 상태) 멀티 스레드 환경에서 안정성을 얻으려면 추가 작업을 해줘야 한다. 예) 여러개의 스레드가 Student라는 객체에 접근했을 때 1번 스레드는 Student에 아무 값이 없는 빈 객체일수도 있고 2번 객체는 이름과 나이가 setter로 설정된 객체일 수도 있다. 하지만 setter를 제거하고 애초에 처음 만들때 값을 가진 객체로 생성하고 그 값이 불변하다면 Thread-safe 하다고 말할 수 있다. 2. 불변 객체 (1) ..
예를들어 apple, banana, grape 가 있으면 보통 for문으로 돌려서.. 마지막 콤마는 빼는 로직을 사용했었다. 이거보다 더 좋은 방법이 있을 거 같았는데 도저히 생각이 안났는데 ㅎ.. 쉬운 방법을 놓고 돌아가고 있었네.. Java8에 추가된 String.join() 메서드 List, Array List fruits = Arrays.asList("apple","banana", "grape"); String result = String.join(",", fruits); EnumSet EnumSet.allOf(Topping.class).stream().map(Enum::toString).collect(Collectors.joining(", "));
인프런 강의 : 스프링 핵심 원리 강의를 듣던 중.. @PostConstruct, @PreDestroy 애노테이션의 특징 최신 스프링에서 가장 권장하는 방법이다. 애노테이션 하나만 붙이면 되므로 매우 편리하다. 패키지를 잘 보면 javax.annotation.PostConstruct 이다. 스프링에 종속적인 기술이 아니라 JSR-250 라는 자바 표준이다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작한다. 컴포넌트 스캔과 잘 어울린다. 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것이다. 외부 라이브러리를 초기화, 종료 해야 하면 @Bean의 기능을 사용하자. 여기서 마지막 줄 유일한 단점은 외부 라이브러리에서는 적용하지 못한다. 라는 말이 있었는데.. 사실 이 말이 제대로 와닿지 않았다. 외부..
페이지별 view count를 측정하기 위해.. controller 진입 마다 log 테이블에 저장하기로 했다. (하지만 이건 처음부터 잘못된 선택이였음..😅) 비록 view count를 측정하는 방법 접근이 좀 잘못된 거 같지만~ AOP 써본 기념으로 정리 AOP란? AOP는 Aspect Oriented Programming 의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다. 1. 먼저 log를 쌓을 Entity 설정 @Getter @NoArgsConstructor @SequenceGener..