자바 뚝딱거리기 11

[JAVA] 커스텀 어노테이션 만들기.. 그런데 Path Variable를 곁들인

위와 같이 컨트롤러 단에서 API를 통해 들어오는 jwt 토큰과 Path Variable로 들어오는 유저 아이디가 같은지 확인하고 아니라면 Unauthorized 에러를 보내는 어노테이션을 만드려고 했다. 이전에 Argument Resolver를 통하여 파라미터에 어노테이션을 붙여 사용해 본 적은 있으나, 메소드에 어노테이션은 붙여본 적이 없어 이참에 한번 도전해보기로 했다. 서비스단에서 검사하는 대신 커스텀 어노테이션을 쓰는 이유를 간략하게 설명하자면, AOP를 통해 반복되는 코드를 줄이고 재활용성을 높이기 위해서이다. AOP는 Aspect Oriented Programming의 줄임말로 비즈니스 로직에서 핵심 로직이 아닌 공통적인 부분(로깅, 보안 등)을 분리시켜 비즈니스 로직에선 핵심 로직만 집중할..

[JAVA] 네이버 소셜 로그인 REST API 적용하기

Java SpringBoot 환경에서 네이버 소셜 로그인을 구현하기로 했다. OAuth는 사용하지 않았다. 이전에 카카오 소셜 로그인을 진행했기에 한결 수월하게 하지 않을까? 했지만 어쩌다보니 삽질을 많이 했다... 🥲 아무튼 나처럼 삽질하는 사람이 늘지 않기를 바라며 과정을 정리해보기로 했다. 순서는 다음과 같다. 1. Naver Developer 에서 클라이언트 ID, 클라이언트 시크릿을 발급받는다. 2. 키들을 이용해 인가 코드 발급받기 3. 인가 코드를 활용해 토큰 발급받기 4. 토큰으로 사용자 정보 가져오기 1. Naver Developer 에서 키 발급받기 Naver Developers 에 접속해 Application - 애플리케이션 등록을 클릭한다. 애플리케이션 등록을 위해 애플리케이션 이름..

[JAVA] 카카오 소셜 로그인 REST API 적용하기 (OAuth2 X)

원래 자체 서비스에서도 OAuth2를 사용하려고 했는데 Spring Security를 사용하지 말라는 공지가 들어왔다. 아쉽지만 OAuth2를 사용하지 않고 서비스에 소셜 로그인을 적용하기로 했다. (어차피 카카오 소셜 로그인 API는 OAuth2 기반이라 괜찮을 지도 모른다는 생각도 ...ㅎ-ㅎ) 카카오 소셜 로그인을 자바에 적용시키는 방법은 크게 아래와 같은 차례를 따른다. 1. Kakao Developer에서 클라이언트 키 발급받기 2. 키를 사용해 API에 인가 코드 요청 보내기 3. 받은 인가 코드를 사용해 API에 토큰 발급 요청 보내기 4. 받은 토큰을 활용해 사용자 정보 가져오기 5. 로그아웃 하기 리팩토링을 거치지 않은 코드다... 🙃 흐름을 이해한다는 데 의의를 두자ㅎㅎ (+) 2020..

[JPA] 3. 영속성 관리

자바 ORM 표준 JPA 프로그래밍 3장 요약입니다 > 한 개만 만들어서 애플리케이션 전체에서 공유 -- 여러 스레드가 동시에 접근해도 안전 -> 스레드끼리 공유 가능 엔티티 매니저 -- 엔티티 매니저 공장에서 만들어짐. 비용이 거의 안 든다. -- 동시성 문제 때문에 스레드 간에 공유하면 안 된다. -- 엔티티 매니저는 데이터베이스 연결이 꼭 필요한 시점까지 커넥션을 얻지 않는다. (보통 트랜잭션을 시작할 때 커넥션을 획득한다.) -- 매니저를 통해 영속성 컨텍스트에 접근 및 관리를 할 수 있다. 3.2 영속성 컨텍스트란? persistence context : 엔티티를 영구 저장하는 환경 -- persist() 엔티티 매니저를 사용해 회원 엔티티를 영속성 컨텍스트에 저장 3.3 엔티티의 생명 주기 엔..

[JPA] InteliJ + gradle + SpringBoot + h2 DB(or MySQL) 로 간단 CRUD 기능 구현하기 (2.JPA 시작)

자바 ORM 표준 JPA 프로그래밍 2장 실습+응용입니당 :3 책에 적힌 실습은 환경이 eclipse, maven 기반이라 내 환경에 맞춰 재구성해보았다. 내 환경 : MacOs + InteliJ + Gradle + H2 DB + SpringBoot (2021.06.29) MySQL로도 적용해보았다. 1. 프로젝트 생성 프로젝트명 : jpa-study 패키지 구성 : 2-1. H2 데이터베이스 설치 H2 Database Engine에서 OS에 맞는 버전을 다운받는다. 압축 파일을 풀면 아래와 같은 파일이 생긴다. h2 > bin 으로 들어가 jar 파일을 실행시킨다. h2 웹 브라우저 환경이 뜨면 아래와 같이 URL 경로를 변경하고 연결을 수행한다. 책에 적힌 경로를 먼저 입력하면 오류가 일어날 것이다...

[JPA] JPA는 왜 써야할까? (1. JPA 소개)

자바 ORM 표준 JPA 프로그래밍 1장 요약 정리본입니당 :3 JPA를 사용하기 전 문제점 CRUD SQL 반복 작성 데이터 중심 모델이 되기 쉬움 JPA를 사용하면서... CRUD SQL 자동 처리 객체 모델링과 관계형 데이터베이스 사이의 차이점 해결 객체 지향적 개발 -> 생산성, 유지보수 성능 향상 1.1 SQL을 직접 다룰 때 발생하는 문제점 1.1.1 수많은 반복 테이블마다 CRUD SQL 작성. 반복되는 코드.. 지루함 :( 1.1.2 SQL에 의존적인 개발 엔티티 : 비즈니스 요구사항을 모델링한 객체 SQL에 모든 것을 의존하는 상황에서, 개발자는 엔티티를 신뢰하고 사용할 수 없다.. 이건 진정한 의미의 계층 분할이 아니다. 논리적으로 엔티티와 JDBC&SQL이 아주 강한 의존 관계를 가지..

[Spring] @ConstructorProperties는 꼭 필요한가요? (feat.Lombok)

제목이 저런 건 코드 리뷰를 받던 중 이런 질문이 들어왔기 때문이다. 당시 내 코드는 이랬다. 음... 저걸 쓰지 않으면 에러가 나서요... 라고 답할 순 없었기에 적합한 이유를 찾아야 했다. 이유는 lombok 1.16.20 브레이킹 체인지 에서 찾을 수 있었다. 내 lombok 버전은 1.18.18 이었지만 Java8을 쓰고 있었기에 1.16.20 이전의 사용법이 적용된 듯 했다. 그렇다면 나중에 Java9 이상으로 업데이트를 하면 이 코드가 에러가 나겠구나, 싶어 다른 방법을 써보기로 했다. 먼저 해당 어노테이션을 없애기 위해 무슨 역할을 하는지 알아야했다. @ConstructorProperties ConstructorProperties 는 생성자의 속성 명칭을 지정해지주는 어노테이션으로 역직렬화를..

[JAVA] 스트림 소개

많은 요소를 포함하는 커다란 컬렉션은 어떻게 처리해야 할까? - 0. 스트림이란? 스트림 stream 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 값 요소 스트림은 쉽게 말하자면 데이터 컬렉션 반복을 멋지게 처리하는 기능이다. 멋지다는 게 무슨 의미인가? 아래 코드를 보자. 저칼로리의 요리명을 반환하고, 칼로리를 기준으로 요리를 정렬하는 기능을 구현한 코드다. // 스트림 미사용 List lowCaloricDishes = new ArrayList(); for(Dish dish : menu) { if(dish.getCalories() < 400) { lowCalroicDishes.add(dish); } } Collections.sort(lowCaloricDishes, new Comparator (..

[JAVA] 스트림 활용

스트림 API 가 지원하는 다양한 연산을 살펴보자 1. 필터링 - filter : Predicate 로 필터링 List beverageMenu = menu.stream() .filter(Beverage::isTea) // 음료 종류가 차인지 확인하는 메소드 참조 .collect(toList()); Predicate boolean을 반환하는 함수 - distinct : 고유요소 필터링 List beverageMenu = menu.stream() .filter(Beverage::isTea) .distinct() // 중복을 '필터링' .collect(toList()); 2. 슬라이싱 - takeWhile, dropWhile : Predicate 를 이용한 슬라이싱 (JAVA 9) filter 는 전체 스트림..

[JAVA] 람다 표현식

더 간결하고 유연한 코드를 구현하는 방법이 있을까? 자바 8이 새로 선보인 기능, 람다 표현식을 소개해본다. 람다 표현식 lambda expression 메소드로 전달할 수 있는 익명 함수를 단순화한 것 람다 표현식은 코드 단순화에 존재 의의를 두고 있다. 즉, 동작 파라미터 형식의 코드를 더 쉽게 구현 및 전달할 수 있고 코드를 간결하고 유연해지게 만든다. 1. 특징 - 람다 표현식은... 익명 보통의 메소드와 달리 이름이 없다. 함수 메소드처럼 클래스에 종속되지 않는다. 하지만 메소드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다. 전달 인수로 전달하거나 변수로 저장할 수 있다. 간결성 자질구레한 코드를 구현할 필요가 없다. 2. 구조 및 문법 - 람다 사용하기 어떻게 사용하..