인강을 듣다 H2 데이터베이스 대신 MySQL 로 데이터베이스를 옮겨 보고 싶었다.스프링 부트 설정 부터 시작해보겠다!1)Spring Initializr 에서 H2 DataBase 대신에 MySQL 를 대신 선택한다.만들어 주고 ~2)MySQL Work Bench에 접
아까 말했듯 우리가 직접 구현하는 것보다는 외부 서버가 나을 것이다!3)우리는 앱비밀번호라는게 필요한데 앱 비밀번호를 만드려면 우리의 구글 계정에 2단계 인증이 필요하다. 보안탭에서 2단계 인증을 사용하는 로그인을 설정해 주어야 한다.4)저 위에 검색창이 앱 비밀번호라
지극히 평범한 Member의 예를 들겠습니다. age를 가지고 이것저것 해보겠습니다.NativeQuery와 Pageable 모두 사용해 보겠습니다위에서 보듯이 Pageable 객체를 PageRequest.of로 생성해서 가져올 수 있습니다.첫 번째 파라미터에는 페이지,
찾아보니 Quartz는 더욱 복잡한 작업에 사용되고 스프링 스케줄러는 상대적으로 쉬운 작업에 사용된다고 한다. 여기서 더욱 복잡한 작업은 정교한 시간 설정 및 한 job이 다른 job에게 영향을 줄 수 있는 , 작업간의 복잡한 상황이 존재하는 경우를 의미한다.참고로 @
김영한 강사님의 스프링 MVC 2편을 듣고 Cookie 로그인 부분을 이해,REST API 스타일로 바꾸어 보았다.또한 mysql과 연동또한 하였다. domain-Member 먼저 로그인을 위해서는 Member가 필요하다. domain이란 패키지내에 Member클래
김영한 강사님의 스프링 MVC 강의 2편을 듣고 수정하고 정리한 내용입니다.위 내용을 텍스트로 풀면1)사용자가 로그인을 시도2)로그인이 성공하면 서버에서 세션 ID를 생성한다. 3)서버 내부에 세션 저장소에 세션 ID를 key,로그인한 사용자를 value값으로 둔다.4
2)객체:AWS 는 s3에 저장된 데이터(예를 들면 이미지나 파일)를 객체라 명명한다. 3)IAM: 공식 문서 https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/introduction.html 에 따르면 우리가
저번 포스트에서 세팅을 완료했었다.저번에 완료된 세팅을 기반으로 스프링 코드를 작성하여 보겠다.또는 이런 식으로 세팅한다.이제부터 작성할 코드는 둘 중에 아무거나 추가해도 상관없다.Member에 자기만의 이미지를 저장하는 식의 상황을 가정하고 실습하여 보겠다.주어진 a
웹 페이지 다운로드: 요청한 URL의 웹 페이지 내용이 다운로드, 크롤러에게 전달데이터 추출: 다운로드된 웹 페이지에서 필요한 데이터를 추출. html의 class,id,tag 등을 활용해서 추출할 수 있다.데이터 저장 및 처리: 추출한 데이터는 필요한 형식으로 가공,
나는 푸시 알림 구현을 공부하기 전에는 왜 필요한지 이해하지 못했다.아니 내가 8시마다 똑같은 공지를 받는 것을 서버가 뭘 해줘야 해?그냥 클라이언트 분들이 알아서 8시 되면 공지를 띄우면 안되나?그렇게 할 수도 있다. 하지만 클라이언트에서만 관리한다면 1)공지 내용
결론부터 말하자면 RESTAPI에서는 주로 세션 기반의 방식보다 JWT 토큰을 사용한다.RESTAPI는 서버가 클라이언트의 상태를 기억하지 않고 클라이언트에 독립적으로 작동하고 그로인해 업그레이드 등 변화가 쉬웠다. 세션 기반은 서버에서 클라이언트의 세션을 관리하였지만
저번 포스팅에서 JWT 를 왜 써야 하는지 , 세션에 비해서는 무엇이 좋은지 , 구조는 어떻게 되는지 알아보았다.인증이란 사용자나 시스템이 자신을 주장한 대상이 누구인지 확인하는 프로세스이다.짧게 설명하면 우리가 네이버에 아이디,비번을 쳐서 로그인을 하고 내가 나라는
저 번에는 @Enumberated로 역할을 받았었다. 하지만 이러니 여러 역할을 할당하기 힘들었기에 이번에는 role을 DB에 직접 저장하고 그로인해 여러 역할을 할당할수도,비즈니스 로직 실행중에 권한을 바꾸어 보도록 해보겠다.https://velog.io/@
한 Entity 가 여러 개의 Enum을 받고 싶을 때가 있다. 그럴때 유용하게 사용될 수 있는 방법이 있다.일단 RoleType은 로 가정한다.1)@ElementCollection(targetClass = RoleType.class) :JPA 에서 컬렉션을 매핑할 때
제목 그대로이다. 자바 String 은 몇 글자부터 DB에 못들어가고 @Lob을 써야 할지 알아보겠다.위에서 이름은 그냥 String name으로 하였다.item의 이름의 길이는 출력결과 255였고 잘 들어가있는 것을 볼 수 있다.그런데!!!256글자가 된다면??이렇게
우리가 필요한 Entity에 생성 날짜와 수정날짜가 항상 필요하다고 하자!그렇다면 이 BaseEntity를 상속한 클래스는 항상 저장할 때마다 createdDate를 사용자가 직접 입력해야 하고, 수정할 떄마다 lastModifiedDate를 입력해야 할까?그것은 아
JPA 강의를 보았다면cascade = CascadeType.ALL을 쓴다면 특정 Entity(A)에 em.persist(Entity)를 하지 않았더라도 그와 연관된 엔티티(B)에서 세팅을 해주기만 하면 자동으로 A까지 테이블에 저장되고 들어갈 수 있었습니다.근데 이를
위와 같은 코드가 있다. 위는 길긴 하지만 SystemOut.println("============"); 이전은 그냥 데이터를 insert 한 것 뿐이므로 ===== 이후 부터만 보면 된다. 위에 대한 실행 결과를 보면 이렇게 쿼리가 나간다. 이를 통해 이전에
둘 간을 맨날 헷갈렸던 이유, 맨날 찾아봤던 이유는 URL을 통해 어떤 내용을 전달했기 때문이다. 아래와 같이 말이다. 둘 간의 차이를 명확하지 이해하지 못해서 생긴 문제인 것 같아서 이 부분을 정리하고자 한다. 위와 같이 PathVariable 을 사용할 경우
메인페이지에서 tmdb의 open API를 통해서 트렌디한 영화 데이터(poster, 제목,장르 이름 등) 을 보여주는 부분이 있다. 이 부분은 Week Trending 영화 데이터와 Day Trending 영화 데이터를 함께 보여준다. 예를 들면 아래의 JSON
MySql 의 기본 INDEX_type은 BTREE 이다. B-Tree 인덱스 구조를 이용하면 데이터에 빠르게 접근 할 수 있다. 아래 그림을 보자 기존 그냥 단순 인덱스를 적용하지 않으면 숫자 70을 찾으려면 DB 전체를 순차적으로 검색할 수 밖에 없다.7검색하고 3
보호자원서버에서 사용자의 자원(email,프로필 등) 을 가지고 오려면 accessToken 이 필요하다 . 여기서 accessToken 은 인가 서버 즉 네이버가 걍 발급해주는 것이므로 우리가 만들거나 이런 것은 아니다. 대략 이런 식의 흐름을 가진다. 우리가 사용할
프로젝트 기능 구현을 빨리 했어야 해서 성능 최적화에 대한 부분은 개발 과정에서 배재하였었다. 리팩토링 기간에 JPA 의 N+1 문제를 해결해서 성능 최적화를 달성해보자!!!프로그램과 User 중간테이블로 Review가 존재하며(프로그램과 User 는 다대다)Revie
지금부터 쓸 글은 제가 WebClient 를 비동기적으로 사용하려고 아둥바둥 거린 점을 기록함을 명시합니다. 솔직히 아직까지도 잘 모르겠습니다. 프로그램 정보를 프론트에 한 api 에 반환하고 있습니다. 그 정보는 open api 를 통해 프로그램 상세 정보, 사람 상
문제점 아래 코드에서 아주아주 간헐적으로 데이터가 중복 저장되는 일이 발생했습니다. 분명 미리 을 통해 이미 저장되어 있는 경우를 판별해서 저장된 경우는 그대로 반환하고 저장되어 있지 않은 경우는 저장해서 반환하는데 어떻게 해서 중복 저장이 된 것인지 이해가 힘들었
Spring 의 특징 스프링이 어떠한 특징을 가지고 있길래 그토록 많이 쓰는지 찾아본다. > ## IoC/DI IoC란 의 줄임말로 제어의 역전이라고 한다. 제어의 역전 은 객체들간의 관계 및 호출을 개발자가 아니라 스프링 프레임 워크에 맡기는 것을 뜻한다.
먼저 주의점의 관찰을 위해 프로젝트를 세팅한다. Team 과 TeamImage 의 관계를 세팅한다. 실험 환경 기준은 하이버네이트 버전 5.6.14 버전이다. @ManyToOne 에서 다(Member) 쪽에서 일(Team)쪽을 fetch Join 을 사용하여 일(Tea
새로 프로젝트를 진행하거나 , 프로젝트를 세팅해야 할 날이 오면 항상 이전에 만든 공통 응답 객체를 계속 복사 붙여 넣기 해가면서 별다른 생각 없이 API 의 응답 타입을 넘겨 주었었습니다.하지만 종종 ResponseEntity 를 사용하는 코드를 볼 때면 공통 응답
ArrayList 와 HashMap 모두 Thread safe 하지 않다는 글을 보았다. 이를 알았으니 테스트를 통해 이를 직접 확인 하고 어떤 경우에 ArrayList 와 HashMap 등을 구현체로 쓰는 것을 지양하고 어떤 경우에는 사용해도 되는지에 대해 알아보기
문제 코드 본 코드 위 코드를 짧게 설명하면 다음과 같다. Post 와 Member 의 중간 테이블로 Member 가 좋아요 눌렀는지 확인 위한 LikePost 중간테이블 좋아요 를 누르지 않은 Member 의 경우 좋아요를 누르면 saveLikePost 메서드 실
위 코드처럼 직접 SecurityContextHolder 에서 인증객체를 직접 꺼내는 방식을 컨트롤러 단이나 서비스 단에서 수행했었다. 하지만 다른 방법도 시도해보자 (장단점이 있을까?)아래와 같이 @AuthenticatinoPrincipal 을 이용해서 이를 해결할
QueryDsl 에 대해 학습을 하였으므로 상황을 가정함으로써 앞으로 잘 쓸 수 있도록 준비를 해보겠다. 소개팅 앱 개발 Member 와 Team 이 존재, 다대일 관계Member 는 age , name , id 가 존재하고 team 은 quality, Name, id
과거의 프로젝트에서 검색을 개발할 때 mysql 의 Like 키워드를 사용했었다. 하지만 더 성능이 좋은 검색 방법도 같이 검색이 되었었는데그 방법은 바로 Elastic Search 를 이용하는 방법이었다.그때는 그렇구나 하고 넘어갔는데정확히 얼마나 성능이 향상 되는지
기존에 @AuthenticatinPrincipal 이나 SecurityContextHolder 를 계속 사용하는 것이 마음에 안들어서 아래와 같은 커스텀 어노테이션을 만들었다. 이런 메서드가 내가 만든 CustomUserDetails 안에 포함되어 있어야 했다.
로그인을 시도하고 성공하면 백앤드가 프론트에게 accessToken 과 토큰 재발행을 위한 refresh Token 을 준다. 백앤드가 로그인시 프론트엔드에게 access token 은 헤더에 refresh token 은 쿠키에 담아 보냈지만 재발행을 할 때는 백앤드가
기존에는... https://velog.io/@dionisos198/%EC%8A%A4%ED%94%84%EB%A7%81-oauth2-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84 이 블로그에서 작성하였던 것처럼 위 흐름에서 프
우리 cre8 서비스에서는 아래 사진과 같이 유저의 프로필을 수정시에 자기소개 글 등등과 함께 자신의 프로필 사진을 변경할 수 있다. 아래와 같이 말이다. 하지만 문득 이런 생각이 들었다. 서비스가 확장됨에 따라서 혹은 Member Entity 의 필드 조건들이 변경될
우리 프로젝트에서는... 위 사진과 같이 동적으로 태그를 사용해서 구인 ,구직 게시글을 검색할 수 있다. 동적으로 태그를 사용해서 검색하기 위하여 MyBatis 나 ,Criteria, 등등을 사용할 수도 있지만 현재 프로젝트는 JPA 중심으로 구성되어 있다는 점,
지난 포스팅에서 주로 여러 실험 과정을 위주로 소개하였기 때문에 이번에는 조금 더 요약 및 보완을 하여서 포스팅을 작성한다.이와 같이 동적으로 쿼리 DSL 을 활용하여 태그 기반으로 게시글을 검색할 수 있는데 fetch Join 을 통해서 쿼리를 하나라도 더 줄이려고
간선의 비용이 모두 1이고 가장 먼 노드를 찾으면 되는 것이므로 가장 먼저 떠올랐던 것은 BFS 였다. 다만 가장 거리가 먼 노드를 찾기 위해 지나온 경로의 수를 queue 의 깊이가 깊어질 때마다 하나씩 증가시켰다.그러기 위해서 Node 란 클래스를 활용했다. 1)
채팅 내용을 어디다가 저장하는게 나을까 하던 중 MongoDb를 선택했다.MongoDB를 사용할 때 Ec2 에 따로 배포를 할까 아니면 클라우드에 저장되는 mongodb atlas 를 이용할 까 생각하다가 편하게 관리를 할 수 있는 atlas 를 사용하기로 마음먹었다.
위 영상과 같이 스크롤을 내리면서 다음 페이지를 탐색할 수 있게 하는 방법을 무한 스크롤 이라고 한다. 이는 스프링 data jpa 의 Slice 를 이용하여 주로 구현하는데 이는 Page 와 달리 count 쿼리가 나가지 않는다는 장점이 있다. 따라서 지금까지 나는
서버에서 클라이언트로... 채팅 기능은 기본적으로 A 클라이언트 가 메시지를 보내면 서버가 메시지를 받고 B 클라이언트로 A 클라이언트로 부터 전달 받은 메시지를 전송하는 과정이라고 할 수 있다. 서버가 클라이언트로부터 메시지를 받는 것은 어렵지 않다. 지금까
이전 블로그에서... 이전 블로그에서 만을 이용하여 채팅 기능을 구현하였다. 만을 사용하여 채팅 기능을 사용할 때 특정한 형식이 사용되지 않는 단점이 있었다. 따라서 이번 블로그에서는 프로토콜을 사용하여 채팅 기능을 구현한다. 상황 설명 1대1 채팅 기능
지금까지 통상적으로 구독을 완료한 이후에 어떤 로직을 처리할 때 다음과 같은 코드로 처리했다. 구독 요청이 온 후를 알리는 event SessionSubscribeEvent 가 발생한다면 위에서 chattingRoomConnectService.isAllConnected
졸업 프로젝트 cre8 에서 구인자가 원하는 분야의 구직자를 조금 더 편리하게 찾을 수 있도록 구인자가 원하는 이미지를 넣으면 그에 대한 응답값으로 유사도가 높은 이미지를 가진 포트폴리오를 추천하는 기능을 만드는 것이 회의 결과 도출 되었다.CNN 이란 Convolut