본문 바로가기

Programming/Java, Spring98

Spring에서 argumentResolver를 사용하여 인증 책임 분리하기 문제의식 다음과 같은 컨트롤러 메서드가 있다고 해보자. @PostMapping("/tasks") public ResponseEntity createTask(@RequestBody TaskCreateReq taskCreateReq, HttpSession session) { final Long userId = (Long) session.getAttribute(LOGIN_SESSION_KEY); if (userId == null) { throw new RuntimeException("bad request. no session."); } taskService.create(taskCreateReq, AuthUser.of(userId)); return ResponseEntity.ok().build(); } 위 코드.. 2023. 7. 23.
스프링 프로젝트 API Server Error 처리하기 1. 통일된 Error Response를 갖게 하자. 문제점 통일된 Response를 갖지 않으면 ... 클라이언트 쪽에서 서로 다른 형식의 Error Response를 처리해야 한다. -> 추가적인 작업과 오류 처리 로직이 필요하게 된다. 제안 다음과 같은 형식의 Error Response 형식을 고려해볼 수 있다. { "message": "Invalid Input Value", "status: 400, // "errors": [], 비어 있을 경우 null이 아닌 빈 배열을 넘긴다. "errors: [ { "field": "name.last", "value": "", "reason": "must not be empty", }, { "field": "name.first", "value": "", "re.. 2023. 7. 9.
StringBuilder와 String 클래스의 문자열 만드는 효율 차이 Java 문자열 연결 Java에서 문자열을 연결하는 방식으로 3가지 방법을 사용할 수 있다. - String을 "+" 연산자로 연결하기 - StringBuffer 클래스의 append() 메서드를 이용하기 - StringBuilder 클래스의 append() 메서드를 이용하기 각각의 방법은 다음과 같다. 1. String을 "+" 연산자로 연결하기 final String testWord = "hello"; String string = new String(); string += testWord; 2. StringBuffer 클래스의 append() 메서드를 이용하기 StringBuffer stringBuffer = new StringBuffer(); final String testWord = "hello".. 2023. 6. 21.
자바 함수형 프로그래밍과 디자인 패턴 디자인 패턴 - 반복해서 등장하는 프로그래밍 문제들에 대한 해법들을 패턴화 해놓은 것 - 패턴들을 숙지해놓으면 비슷한 문제가 생겼을 때 패턴들이 이정표가 되어준다. - 생성 패턴 : 오브젝트의 생성에 관한 패턴 - 구조 패턴: 상속을 이용해 클래스/오브젝트를 조합하여 더 발전된 구조로 만드는 패턴 - 행동 패턴: 필요한 작업을 여러 객체에 분배하여 객체간 결합도를 낮추는 패턴 Builder Pattern - 대표적인 생성 패턴 - 객체의 생성에 대한 로직과 표현에 대한 로직을 분리해준다 - 객체의 생성 과정을 유연하게 해준다 - 객체의 생성 과정을 정의하고 싶거나 필드가 많아 constructor가 복잡해질 때 유용 다음과 같은 field를 가진 User를 만든다고 해보자. private int id; .. 2023. 6. 21.
자바 함수형 프로그래밍 Scope, Closure&Curry, Lazy Evaluation, Function Composition Scope - Closure & Curry - 유효볌위, 즉 변수에 접근할 수 있는 범위를 의미한다. - 블럭 밖과 안 => 변수 사용의 바운더리 - 마찬가지로 람다에서도 이와 같은 원리가 적용된다. - 함수 안에 함수가 있을 때 내부 함수에서 외부 함수에 있는 변수에 접근이 가능하다(Lexical scope). 그 반대는 불가능하다. 예를 들어 lexical scope public static Supplier getStringSupplier() { String hello = "hello"; Supplier supplier = () -> { Stirng world = "world" return hello + world; }; return supplier; } 이때 hello는 supplier 안에서도 접.. 2023. 6. 20.