본문 바로가기

전체 글20

Paging CountQuery With Querydsl 기본적인 페이징 방식 countQuery를 날려 totalCount 체크 기존 fetchResults()가 Deprecated 되면서 아래 방식으로 해결 @Repository @RequiredArgsConstructor public class ItemRepository { private final JPAQueryFactory jpaQueryFactory; public Page getItems(Pageable pageable) { List items = jpaQueryFactory .selectFrom(item) .offset(pageable.getOffset()) .limit(pageable.getPageSize()); long totalCount = jpaQueryFactory .select(item... 2023. 10. 25.
로그인과 JWT 발급 깃허브 저장소 GitHub - solchan98/Playground: 🛝 개발 공부 놀이터 🛝 🛝 개발 공부 놀이터 🛝. Contribute to solchan98/Playground development by creating an account on GitHub. github.com 로그인 및 토큰 발급 2022-09-28 새로 작성되었습니다. 스프링 시큐리티를 활용하여 로그인을 진행하고, JWT를 발급하여 응답해보자. 진행 시나리오 회원가입 로그인 및 AccessToken발급 진행은 우선 회원가입을 진행하여 데이터베이스에 정보를 저장하고, 로그인을 진행하여 검증에 성공하면 AccessToken을 발급하여 응답하는 것으로 마무리한다. 프로젝트 구조 프로젝트의 dependencies는 간단하게 다음과 같.. 2022. 9. 28.
[React] 리액트, 구글 로그인을 진행해보자 현재 본 게시글에서 진행 된 방식은 구글에서 Deprecate 되었습니다! 새로운 방식을 추후 리포스팅 할 예정입니다! 구글 계정을 통한 로그인을 진행해보자! 시나리오는 다음과 같다. 본 포스팅은 구글 서버하고만 통신을 한다. 만약 구글 로그인을 통해 백엔드 서버와 로그인을 진행하는 경우라면 마지막에 작성되어있는 로그인 플로우를 확인하면 된다. 구글 로그인을 통해 응답 받은 데이터 중 다음의 데이터가 존재한다. accessToken(구글에서 발행한 토큰) email name profileImage ...제공 데이터는 더 많고 세부적이지만 위 4개의 데이터만 사용할 예정이다. 글의 중간부분에서 구글에서 응답해주는 전체 데이터를 볼 수 있다. 프로젝트 구성 프로젝트는 기본적인 npx create-react-.. 2022. 4. 11.
Iterator는 무엇이고 왜 사용하는가 Iterator 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다. Collection 인터페이스에 정의된 메서드이므로 Collection 인터페이스의 자손인 List와 Set에도 포함되어 있다. Map 인터페이스를 구현한 컬렉션 클래스는 Key와 Value을 쌍으로 저장하고 있기 때문에 iterator()를 직접 호출할 수 없고, 그 대신 ketSet()이나 entrySet()과 같은 메서드를 통해서 키와 값을 각각 따로 Set의 형태로 얻어온 후 다시 iterator()을 호출해야 iterator을 얻을 수 있다. 이렇게 iterator을 얻은 다음 반복문, 주로 while문을 사용해서 컬렉션 클래스의 요소들을 읽어 올 수 있다. Iterator 인터페이스에 정의된 메서드는 다음과 같다. bo.. 2022. 3. 1.
JVM의 기본 개념 JVM이란? JVM은 Java Virtual Machine의 약자로 자바 가상 머신이다. 자바는 컴파일 단계에서 자바 바이트코드로 변환되는데 JVM은 변환된 자바 바이트코드를 해석하고 실행하는 역할을 한다. 자바 바이트코드 JVM은 사용자 언어인 자바와 기계어 사이의 중간 언어인 바이트코드를 사용한다. 자바 코드를 배포하는 가장 작은 단위이다. 자바 컴파일러는 C/C++ 처럼 고수준 언어를 직접적인 CPU 명령어로 변환하는 것이 아니라, 개발자가 이해하는 자바 언어를 JVM이 이해하는 자바 바이트코드로 변역한다. 따라서 JVM이 설치된 장비라면 CPU나 운영체제가 다르더라고 실행 가능하다. JVM 구조 자바로 작성된 코드의 실행과정을 보면 구조를 알 수 있다. 컴파일 단계에서 자바 코드(.java)가 자.. 2022. 2. 23.
Redis를 통한 JWT Refresh Token 관리 깃허브 저장소 GitHub - solchan98/Playground: 🛝 개발 공부 놀이터 🛝 🛝 개발 공부 놀이터 🛝. Contribute to solchan98/Playground development by creating an account on GitHub. github.com +2022-09-28 새로 작성되었습니다. 본 포스팅은 이전 발급받은 JWT로 요청하기 과정에 이어서 진행된다. JWT는 한 번 발급되면 만료되기 전 까지 삭제할 수 없다. 이 문제를 어떻게 해결할까? 일반적으로 RefreshToken이라는 추가적인 토큰을 통해 이를 해결한다. 그러면 어떻게 해결하는지 자세히 알아보자. Access Token과 Refresh Token 리프레시 토큰을 발급하기 전, 리프레시 토큰이 어떻게 .. 2022. 2. 11.
Refresh Token 발급과 Access Token 재발급 +2022-06-12 새로 작성되었습니다. 이전 포스팅 Redis를 통한 JWT RefreshToken 관리 포스팅과 하나로 정리되었습니다. 2022. 2. 11.
발급받은 JWT로 요청하기 깃허브 저장소 GitHub - solchan98/Playground: 🛝 개발 공부 놀이터 🛝 🛝 개발 공부 놀이터 🛝. Contribute to solchan98/Playground development by creating an account on GitHub. github.com +2022-09-28 새로 작성되었습니다. 로그인과 JWT토큰 발급 이전 포스트에서 Spring Security를 통해 로그인을 진행하고, 토큰을 발급하는 과정을 진행하였다. 이번에는 발급받은 JWT를 통해 권한이 필요한 URI에 요청을 해보자. Spring Security는 여러가지의 필터를 순차적으로 돌며 해당되는 필터를 실행한다. 그리고 인증에 관련된 책임은 AuthenticationManager에 의해 수행된다. 기.. 2022. 2. 11.
[Spring] SecurityContext에 사용자 정보 넣어 테스트하기 Security Context에 우리가 원하는 사용자의 정보를 넣어 테스트가 정상적으로 동작할 수 있도록 해보자. 테스트 케이스를 작성하다 보면 사용자 정보 변경, 로그인 된 사용자만 요청가능한 API를 테스트하는 경우가 있다. 그러기 위해서는 Secutiry Context에 사용자 정보가 들어있어야 한다. 기본적으로 Spring Secutity를 사용하여 로그인 서비스가 구성되어있다는 가정하에 진행한다. WithSecurityContextFactory WithSecurityContextFactory는 SecutiryContext를 생성하여 테스트 시 사용할 수 있도록 해주는 인터페이스이다. 우리는 이 인터페이스의 구현체를 작성하여 사용할 것 이다. createSecutiryContext 메서드의 파라미.. 2022. 2. 10.
Interceptor 사용하여 TypeORM Transaction 적용하기 일반적인 TypeORM의 Transaction TypeORM을 사용하면서 Transation을 적용하려면 코드가 매우 지져분해진다. Spring처럼 @Transactional을 사용하여 간단하게 적용할 수 있지만, 모든 Repository manager에 동일하게 적용되지 않기 때문에 사용하지 않는 것을 추천한다. 따라서 일반적으로 TypeORM을 사용하면서 Transaction을 적용하려면 다음과 같이 사용해야 한다. public testMethoad() { const queryRunner = this.connection.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); try { await qu.. 2022. 2. 10.
[Test] Mockito를 사용해보자 (2) 이전 포스트에서 Mockito가 무엇이고 어떻게 사용하는지 기본적으로 알아보았다. 이번에는 Mockito에서 제공하는 BDD스타일을 정리한다. Mockito의 BDD스타일 이전 포스트에서 Mock객체를 만들어 Stubbing하는 방법을 알아보았다. Mockito에서는 BDD라는 스타일의 방식으로 Stubbing을 제공한다. BDD가 뭔데? BDD는 'Behavior Driven Develop'의 약자로 클래스의 행위에 대한 테스트를 진행한다는 의미이다. 테스트 케이스의 메서드명을 '~클래스는 ~행위를 해야한다'라는 식의 문장으로 작성하며 어떠한 시나리오를 기반하여 작성하는 개발 방법이라고 한다. (BDD에 대해 좀 더 공부하여 개별 포스팅을 하고 링크를 추가해야겠다.) 기본적인 Mock객체를 Stubbi.. 2022. 2. 10.
[Test] Mockito를 사용해보자 (1) Mockito 자바 코드를 테스트는 JUnit5 프레임워크를 통해 진행할 수 있다. 그럼 Mockito는 뭔가? 우선 Mock의 뜻은 모조품이다. 즉, Mockito는 가짜 객체를 만들 수 있도록 해준다. Mock이 필요한 이유 그럼 왜 가짜 객체가 필요한가? 예를 들어, 나는 B라는 객체의 run()메서드를 테스트 하고 싶다. 그런데 B 인스턴스를 생성하기 위해서는 A라는 인스턴스를 B의 생성자 매개변수로 넘겨주어야 한다. 즉, B가 A에 의존하고 있는 것을 알 수 있다. 만약, A가 또 다른 객체에 의존하고 있다면 B의 run()메서드를 테스트 하기 위해 많은 인스턴스를 생성해야 한다. 이렇게 강한 의존성을 끊기위해 가짜 객체를 생성하고 이를 Mockito를 통해 사용할 수 있다. 또, 구현체가 없는.. 2022. 2. 10.
[Test] JUnit5을 사용해보자 (2) JUnit5 이전에 JUnit5가 무엇인지, 기본적인 사용방법을 알아보았다. 이번 포스트는 대표적인 Assertion을 통해 테스트를 진행해볼 것이다. Assertion 테스트를 진행하기 위해선 여러가지 상황이 필요하다. 예를 들어 Account라는 객체의 age가 19미만인 경우 술과 담배를 판매하면 안되는 상황이라면 술과 담배 판매 메서드를 테스트할 때, age < 19의 경우는 판매가 되면 안되는 것을 테스트 하면된다. 위 예는 판매라는 메서드의 어떠한 경우이며, 판매가 아닌 또 다른 기능을 수행하는 메서드라면 해당 기능에 맞는 테스트를 진행해야 한다. 이를 위해 Assertion이 존재한다. Assertion의 메서드는 꽤 많이 정의되어있다. 따라서 자주 쓰이는 메서드를 위주로 정리하였다. 자주 .. 2022. 2. 10.
[Test] JUnit5을 사용해보자 (1) Test Environment IDE: IntelliJ Java version: 11 Test Framwork: JUnit 5 Gradle 테스트 코드의 필요성을 느끼게 되다. 사실 YAPP19th활동을 하지 않았으면 아직까지도 테스트 코드 작성의 필요성을 느끼지 못하였을 것이다. 그럼 왜 테스트 코드의 중요성을 느꼈나? 자바를 배우고, 스프링 프레임워크를 공부하면서 어플리케이션 로직을 최적으로 짜는 것이 중요하다고 생각했다. 당시에는 테스트 코드의 존재 또한 모르는 상태였다. 로직 작성을 끝마친 후에는 항상 "드디어! 깔끔하게 마무리 했다!" 이렇게 일이 끝났다고 생각을 했다. 하지만 테스트 코드의 존재를 알게된 후, 또 다른 일이 생겨버린 느낌이었다. 😮‍💨 그런데 YAPP 활동을 하며 프로젝트를 진.. 2022. 2. 10.
[SpringBoot] FCM을 통해 Push알림 보내보기 (  + 진행 당시, 기능 구현에 집중하다보니 전체적인 설계나 코드가 클린하지 못할 수 있으니 이 부분은 리팩토링 하면서 적용하시면 좋을 것 같아요! :)  ) 현재 참여하고 있는 IT연합 동아리 YAPP에서 진행중인 프로젝트에서 Push 알림을 사용하기로 하였다.하지만 Push알림을 구현 해본적이 없기 때문에 이번에 시도를 해보았다.간단하게 타이틀과 메세지만 보내보자!👏FireBase 프로젝트클라이언트와 서버의 작업을 시작하기 전, Firebase 작업먼저 준비하여야 한다.프로젝트를 생성하고 클라이언트와 서버 각각의 설정파일을 준비해야 한다.프로젝트 생성다음의 주소로 들어가서 프로젝트를 생성한다.Firebase프로젝트 만들기프로젝트 생성은 매우 간단하여 이미지 자료는 첨부하지 않았다.진짜 간단..클라.. 2022. 2. 10.
[Spring] DispatcherServlet이란 무엇인가? DispathcerServlet Dispathcher의 dispatch는 보내다는 뜻을 가지고 있다. 즉, Servlet으로 보낸다는 뜻이다. servlet-container 내에서 작동된다. [FrameworkServlet.java > HttpServlet.java > Servlet.java] 를 상속받아 구현한 Servlet이다. 따라서 Servlet-Container와 Servlet의 개념을 먼저 알고 있어야 한다. Servlet 정의된 클라이언트의 요청에 대해 상응하는 응답 결과인 웹 페이지나 결과값을 동적으로 생성해 주기위한 자바 프로그램이다. 스레드 단위로 실행된다. Servlet은 독립적으로 실행될 수 없으며, Servlet-Container에 의해 관리된다. 다음은 java8에서 제공하는 .. 2022. 2. 10.
[SpringBoot] Redis를 SpringBoot 프로젝트에서 사용해보자 로그인 관리를 공부하면서, 세션과 리프레시 토큰을 효율적으로 관리하는 방법 중 메모리에 저장하여 빠른 접근성과 동시에 디스크에도 저장하여 영속성까지의 이점을 갖는 Redis를 알게 되었다. 로컬에 설치하고 SpringBoot에서 사용해보자. Redis는 메모리에 저장하여 빠른 접근과 디스크에 저장하여 영속성 또한 가지고 있다. 이런 영속성에 대해 snapshotting(RDB)과 AOF 두 방식이 존재한다. sanpshotting은 시간, 저장 횟수에 대해 주기를 두어 디스크에 바이너리 데이터로 dump.rdb파일에 저장하는 방식이다. AOF는 조회명령을 제외한, 입력/수정/삭제 명령이 실행될 때마다 버퍼에 기록한다. 이후 주기적으로 파일에 저장한다. 기본값으로 appendonly.aof파일에 저장된다... 2022. 2. 10.
[SpringBoot] Controller의 여러가지 요청과 응답 처리 스프링 어플리케이션에서 클래스를 정의하면서 @Controller 어노테이션을 추가하면 해당 클래스는 Controller로 등록된다. 클라이언트가 요청을 보내면 DispatcherServlet는 Controller로 등록된 객체 중 해당되는 객체의 메서드를 핸들러가 찾는다. @Controller // 2022. 2. 10.
[Spring] 스프링 컨테이너, Bean 등록 및 사용하기 이 게시글은 스프링 컨테이너와 Bean을 깊게 다루기 보다는 스프링 컨테이너와 Bean의 흐름을 이해하고 어떻게 사용하고 사용되는지를 알아보는 것이 목적이다. 스프링 컨테이너를 배우기에 앞서 알고있어야 하는 패턴이 있다. 바로 싱글톤 패턴이다. 스프링 컨테이너는 스프링에서 사용되는 객체(Bean)를 싱글톤으로 관리해주기 때문이다. 싱글톤 패턴이 무엇인지 간단하게 이해하고 스프링 컨테이너가 무엇인지 알아보자. 싱글톤 패턴이 뭔데? 싱글톤 패턴 어떠한 객체를 단 한 번만 생성하고, 생성된 객체를 어디서든지 참조할 수 있도록 하는 패턴이다. 다음 예제를 보고 이해해보자 프린터를 사용하는 프로그램을 생각해보자. 프린터 객체 1. static영역에 객체를 1개만 생성해둔다. 2. printer 인스턴스가 필요하면.. 2022. 2. 10.
[Spring Security] @AuthenticationPrincipal 로그인한 사용자 정보 받아오기 Spring Security에서는 Session에서 현재 사용자의 정보를 다음과 같이 Principal로 조회할 수 있다. Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); User user = (User)authentication.getPrincipal(); Principal 객체는 Java 표준 객체이고, 받을 수 있는 정보는 name뿐이다. 하지만 우리는 name뿐이 아닌 Account의 많은 정보를 얻고싶다. 그리고 Account의 정보를 Controller에서 맵핑 메서드의 파라미터로 받는 것을 효율적으로 받기 위해 @AuthenticationPrincipal과 어댑터 패턴을 적용하여 사용.. 2022. 2. 10.