개발

개발/모던 자바 인 액션

10. 람다를 이용한 도메인 전용 언어

10.1 도메인 전용 언어DSL은 특정 도메인 문제를 해결하기 위해 만든 언어이다. 특정 비지니스 도메인을 인터페이스로 만든 API라고 생각할 수 있다.DSL을 이용하면 사용자가 특정 도메인의 복잡성을 더 잘 다룰 수 있다. 저수준의 구현 세부 사항 메서드는 private로 만들어서 저수준 구현 세부 내용은 숨길 수 있다. 이런식으로 사용자 친화적인 DSL을 만들 수 있다. 10.1.1 DSL의 장점과 단점DSL은 만병통치약이 아니다. DSL을 도메인에 이용하면 약이 될 수도 독이 될 수도 있다.장점단점간결함DSL설계의 어려움가독성개발 비용유지보수추가 우회 계층집중새로 배워야 하는 언어관심사분리호스팅 언어의 한계 10.1.2 JVM에서 이용할 수 있는 다른 DSL 해결책내부 DSL내부 DSL은 순수 자바..

개발/모던 자바 인 액션

9. 리팩토링, 테스팅, 디버깅

9.1 가독성과 유연성을 개선하는 리팩토링람다 표현식은 익명 클래스보다 코드를 더 간결하게 만들어준다. ⇒ 3장에서 확인해봤었다. 게다가, 재활용이 가능하므로 더 큰 유언성을 갖츨 수 있다. 9.1.1 코드 가독성 개선익명 클래스를 람다 표현식으로 리팩토링하기람다 표현식을 메서드 참조로 리팩토링하기명령형 데이터 처리를 스트림으로 리팩토링하기 9.1.2 익명 클래스를 람다 표현식으로 리팩토링하기주의할 점이 있는데, 모든 익명 클래스를 람다 표현식으로 바꿀 수 없다.익명 클래스의 this와 super는 람다 표현식에서는 다른 의미를 갖는다. 익명 클래스에서 this는 익명 클래스 자신을 가르키지만 람다 표현식에서 this는 람다 표현식을 포함하는 캘르스를 가르킨다.익명 클래스는 감싸고 있는 클래스의 변수를 ..

개발/모던 자바 인 액션

5. 스트림 활용

5.1 필터링5.1.1 프레디케이트로 필터링List menu = Arrays.asList( new Dish("pork", false, 800, Dish.Type.MEAT), new Dish("beef", false, 700, Dish.Type.MEAT), new Dish("chicken", false, 400, Dish.Type.MEAT), new Dish("french fries", false, 530, Dish.Type.OTHER), new Dish("rice", true, 350, Dish.Type.OTHER), new Dish("season fruit", true, 120, Dish.Type.OTHER), new Dish("pizza", true, 550, Dish.Type.OTHER), new ..

개발/모던 자바 인 액션

4. 스트림 소개

컬렉션(Collection)을 활용하면 데이터를 그룹화하고 처리할 수 있다. ⇒ 너무 익숙하다,,Collection과 Stream의 차이를 정리하여 표로 정리해보았다.CollectionStream동작 형식명령형선언형병렬성가능한데, 복잡간단(선언형)유연성복-붙함수 파라미터화특징- Sequantial, Random Access - 데이터 표현에 집중 - 외부 반복(반복문을 직접 작성)- Sequantial Access - 데이터 처리에 집중 - 내부 반복(반복문 작성 X) - 파이프 라이닝 4.1 스트림이란 무엇인가?스트림을 사용하면 선언형으로 컬렉션 데이터를 처리할 수 있고, 데이터를 투명(transaparent)하게 병렬적으로 처리할 수 있다.선언형으로 코딩을 할 경우의 장점은 새로운 기능을 구현할 때 ..

개발/모던 자바 인 액션

3. 람다 표현식

2장에서 동작 파라미터화를 이용해서 요구사항에 효과적으로 대응하는 코드를 구현해봤다.이번 장에서는 인터페이스와 형식 추론의 기능을 확인해보고, 메서드 참조기능을 공부한다. 3.1 람다란 무엇인가?람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다.익명보통의 머세드와 달리 이름이 없으므로 익명이라 칭한다.함수람다는 특정 클래스에 종속되지 않으므로 메서드가 아닌 함수다. 하지만 메서드처럼 파라미터, 바디, 반환 형식, 예외 리스트를 포함한다.전달람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다.간결성익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없다.람다를 통해서 간결한 방식으로 코드를 전달할 수 있다. 람다를 통해서 Java8 이전에 불가능했던 일을 가능하..

개발/모던 자바 인 액션

2. 동작 파라미터화 코드 전달하기

동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드블럭을 의미한다.동작 파라미터화를 사용하며 자주 바뀌는 요구사항에 효과적으로 대응할 수 있다.2.1 변화하는 요구사항에 대응하기녹색 사과 필터링하기public static List filterGreenApples(List inventory) { List result = new ArrayList(); for (Apple apple: inventory) { if (Color.GREEN.equals(apple.getColor())) { result.add(apple); } } return result; }여기서 빨간색 사과도 필터링하고 싶으면, 전체 코드를 복사-붙혀넣기 해서 수정해야한다. 이렇게 단순 복-붙을 하면 코드 동작을 바꾸고 싶을 때 ..

개발/모던 자바 인 액션

1. 자바 8, 9, 10, 11: 무슨 일이 일어나고 있는가?

1.1 역사의 흐름은 무엇인가?Java8에서 가장 큰 변화가 생김. ⇒ 간결한 코드, 멀티프로세서의 쉬운 활용Java5에서는 스레드풀, 병렬 실행 컬렉션(concurrent collection)을 도입Java7에서는 포크/조인 프레임워크 도입Java8에서는 이전과 다른 새로운 방식(함수형 프로그래밍)으로 병렬실행을 지원함. ⇒ 제대로 사용하려면 여러가지 규칙을 지켜야함.Java9에서는 리액티브 프로그래밍이라는 병렬 실행 기법을 지원하게 됨 1.2 왜 아직도 자바는 변화하는가?수많은 프로그래밍언어사이에서 살아남기 위해 변화한다.이제는 빅데이터에 직면하면서 멀티코어, 컴퓨터 클러스터를 이용해서 효율적으로 처리하는 요구사항이 생겼다. 즉, 병렬 프로세싱의 요구사항이 생겼다.따라서 Java8에는 기존의 객체지향..

개발/스프링

SpringSecurity 항상 403에러가 뜨는 이유

문제 발생SpringBoot Validation 패키지를 추가한 뒤 Validation을 테스트하던 중 이상한 문제가 발생했다.400 Bad Request가 떠야하는 부분에서 403 Forbidden이 뜨는 것이었다.단순하게 403만 뜨는게 아니라 body가 완전히 비어져있으며, Spring의 로그에 관련한 어떠한 에러도 뜨지 않는다.분명 Spring 로그를 보면 validation에 성공했고, 400을 내려야할 것 같은데 왜 다른 에러도 없이 403이 내려갈까?? Spring의 에러처리와 Tomcat에러 발생Validation쪽이든 어디서든, 에러가 발생하면 DefaultHandlerExceptionResolver로 넘어가서 처리하게 된다.@Nullable protected ModelAndView ha..

개발/스프링

SpringSecurity로 JWT 인증 구현

구현JwtAuthenticationFilterSpringSecurityFilter에 등록할 필터 중 하나로, 요청에 token이 포함되어 있는지, 포함되어 있다면 유효한지,유효하다면 DB에 조회하여 Authentication객체를 만들고, SecurityContextHolder를 통해서 저장하는 역할을 한다.@Slf4j @Component @RequiredArgsConstructor public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtUtilities jwtUtilities; @Override protected void doFilterInternal( HttpServletRequest request, Ht..

개발/스프링

SpringSecurity 구조

Tomcat의 구조요청이 들어오면 여러가지 Filter들을 통해서 연쇄적으로 동작이 수행된다.DispatcherServlet을 통해서 어떤 Controller로 들어오는 요청인지 확인하고 해당 Controller를 통해 요청을 처리한다. SpringSecurity 추가시SpringSecurity를 추가하게 되면 내장된 Filter가 등록되고, 이를 SecurityFilter라 부른다. 💡더 정확히는 Tomcat의 filter중 Spring에서 작성된 DelegatingFilterProxy를 filter로 등록한다. 이 DelegatingFilterProxy는 내부적으로 스프링의 Bean인 FilterChainProxy를 사용하는데, 이는 SecurityFilterChain을 사용해서 SecurityFil..

피곤한투티
'개발' 카테고리의 글 목록