분류 전체보기53 자바의 Optional 알아보기 자바는 참조변수에 기본적으로 null을 허용한다. 상황에 따라 null을 사용할 수 있다는 것이 편리는 하지만 참조 변수를 안전하게 사용하기 위해선 null 체크가 필수다. null 체크를 하지 않으면 runtime중에 NullPointException이 언제 던져질지 모른다. public void savePerson(Person person) { if(person == null) thorw new RuntimeException(); repository.save(person); } 보통 위와 같이 null 체크를 하게 되는데 코드를 지저분하게 만든다. 그래서 대체로 나온 것이 Optional이다. Optional은 Wrapper 클래스의 일종으로 값이 null일 수 있음을 알려준다. Optional 생성.. 2021. 11. 9. Spring JPA Specification을 사용해 유연하게 조회 API 만들기 초기 프로젝트가 작았을 때, 조회 API를 만드는 것은 크게 어렵지 않았습니다. 하지만 기능이나 데이터가 추가되면서 조건식이 추가될 때마다 Repository 메서드를 만들어야 하는 게 너무 비효율적이었습니다. 혹시나 구글링을 해보니 JPA에서 Specification라는 것을 제공해주네요. 일단 Specification을 적용하기 전부터 보겠습니다. Person, Team 엔터티와 Controller, Repository를 만들었습니다. Person.class @Entity @Getter public class Person { @Id @GeneratedValue @Column(name = "person_id") private Long id; private String firstName; private .. 2021. 11. 8. Layered Architecture 간단히 살펴보기 처음 스프링을 공부하면서 Controller, Service, Repository를 만들어 개발을 하는데 Layered Architecture에 대해 무지했던 나는 각각의 용도와 필요성을 느끼지 못했었다. 오히려 하나의 요청을 처리하기 위해 단계별로 함수를 호출하는 것이 오히려 비효율적이지 않나라는 생각을 했었다. 하지만 공부를 해보면서 필요성을 알게 되었고 구조를 지켜가며 개발을 하고 있다. 이제 간단히 소개해 보겠다. Layered Architecture는 Presentation, Business, Persistence, Database로 4계층으로 나누어져 있다. 각 계층마다 역할과 책임이 나누어진다. 그리고 계층은 Presentation -> Business -> Persistence -> Dat.. 2021. 11. 8. Tennis Together 4주차 4주 차는 지금까지 설계한 ERD와 API를 기반으로 본격적으로 구현하기 시작했다. 프로젝트의 백엔드 팀원들은 로그인부터 유저, 테니스장, 모집글, 댓글 CRUD 등 개발해야 할 부분을 나누어 담당하기로 했다. 이번 주 내가 맡은 업무는 테니스장과 위치 정보를 조회하는 API를 만드는 것이다. Layered Aarchitecture기반으로 Controller, Service, Repository를 만들어 구현했다. (Layered Architecture 간단히 살펴보기) 조회 API를 작업을 하면서 이슈 하나가 있었다. 조회할 때 query string을 받아와 조건을 줄 수 있다. 예로 회원을 조회하는데 성별의 조건을 '남자'로 해서 남자 회원만 조회하도록 말이다. 그런데 문제는 조건을 추가할수록 조건.. 2021. 11. 7. ThreadLocal 이란 ThreadLocal은 쓰레드별로 사용할 수 있는 변수 저장 공간이라고 생각하면 된다. 간단한 예시를 보자. @Slf4j public class NonThreadLocalTest { static String data; public static void main(String[] args) throws InterruptedException { data = "main data"; Thread thread1 = new Thread(() -> { data = "thread1 data"; log.info(" data={}", data); }); thread1.setName("thread1"); Thread thread2 = new Thread(() -> { data = "thread2 data"; log.info(.. 2021. 11. 1. @RestControllerAdvice 예외 처리 기본적으로 스프링은 요청에 대해서 예외가 발생하면 Whitelabel Error Page가 보여진다 하지만 일반 사용자한테 저런 에러 페이지를 보여주는 것보다 의미 있는(?), 알 수 있는 문구를 보여주면 좋을 것이다. 스프링에서는 @RestControllerAdvic를 사용해서 예외를 깔끔하게 처리할 수 있다. 예외가 발생하면 미리 정의해놓은 응답으로 보낼 수 있다. 간단하게 예제를 만들어 보겠다. ErrorCode @RequiredArgsConstructor @Getter public enum ErrorCode { NOT_FOUND_USER(HttpStatus.NOT_FOUND, "회원을 찾을 수 없습니다."), NEED_TO_LOGIN(HttpStatus.UNAUTHORIZED, "로그인이 필요합니.. 2021. 10. 31. 이전 1 ··· 4 5 6 7 8 9 다음 728x90