기타

· 기타
https://chat.lmsys.org/ 1주일 전부터 위 사이트에서 성능이 무시무시하다는 also GPT2를 접하고 나는 간간히 사용하고 있었는데 방금 5/14 새벽 2시 open-ai 발표 보고 놀랐다.  새로 발표하는 GPT-4o가 also GPT2였던 것(?) 진짜 벤치마크가 이렇게 차이 날 줄은 몰랐는데   또한 실시간 화면 감지, 리얼타임 대화 등 보면서 속도가 말이 안 된다고 생각했다.그리고 방송이 끝나고 바로 API가 풀렸다고 해서 내 서비스인 RESTFUL API 서비스에 적용해 봤다. 기존에는 gpt-3-turbo와 gpt-4 모델만 사용했었고 테스트 결과 응답 시간이 거의 1/3으로 확 줄어버렸다.  영상 보니깐 통역사는 여기서 사라진다고 말하는 느낌이 들었다... 너무 빠른 응답속..
· 기타
이번 주제도 cs 공부를 하다가 나온 주제다. 일반적으로 한 트랜잭션에 하나의 영속성 컨텍스트가 할당된다. 즉 A라는 트랜잭션 서비스에서 user를 찾으면 user를 영속성 컨텍스트에 저장. 그런데 여기서 나온 궁금증이 "만약 A서비스에서 B트랜잭션 서비스를 호출하고 user를 조회하면, A의 영속성 컨텍스트를 이용하나?" 이게 물음이었다. 테스트를 위해 간단한 서비스를 만들었다. @Override @Transactional public void findUser(Long id) { // 첫번째 트랜잭션에서 유저 조회 log.info("서비스1"); User user = userRepository.findById(id).get(); emailService.findUserUser(id); } ㅡㅡㅡㅡㅡㅡㅡㅡ..
· 기타
CS 준비를 하면서 팀원들이랑 얘기하는데 나왔던 주제였다. 보통 JPA는 쓰기 지연을 사용한다. 그래서 쓰기 지연 SQL 저장소에 쿼리를 모아두었다가, flush를 하면 그 순간 쿼리를 날려서 반영시키는 것이 보통. 근데 이전에도 한번 다뤘던 주제인데 @BeforeEach void setUp(){ User user = User.builder() .email("test@test.com") .profileImage("ex") .nickname("ex") .isOnline(false) .type("kakao").build(); User save = userRepository.save(user); System.out.println(save.getId()); } 여기서 save를 하면 분명 저장소에 모아둬야 하는..
· 기타
https://www.youtube.com/watch?v=K00xh3zsof0 해당 유튜브를 보고 정리한 내용입니다. 우선 내가 아는 HTTP는 무상태다. 즉 클라이언트가 서버에 연결을 요청하면 TCP/IP 통신을 통해 가상 연결을 진행하고, 서버는 HTTP 요청을 받아서 RESPONSE를 내뱉으면 연결은 끊어진다. 그러면 현재 유저가 로그인 된 상태인지는 어떻게 알까? 로그인의 경우 크게 JWT, 세션을 사용한다. 즉 클라이언트에게 토큰이든 세션ID든 쿠키에 담아서 전달해주게 되는데, 해당 쿠키를 같이 서버로 전달해주면서 유저의 로그인 상태를 확인한다. 그럼 서버는 유저의 정보를 어디에 저장하냐? 그게 데이터베이스(DB)다. 결국 클라이언트는 쿠키로 기억, 서버는 DB로 기억하고 서로의 연결을 확인하게..
· 기타
JPA는 DB에 반영이 돼야 하는 변화가 생기면 영속성 컨텍스트에 모아두고 트랜잭션이 커밋되는 시점에 한 번에 데이터베이스에 반영시킨다. 이것을 쓰기 지연 전략이라고 한다. 분명 나는 개념을 이렇게 알고 있었고, 문제는 아래의 테스트에서 발견됐다. @BeforeEach void setUp(){ User user = User.builder() .email("test@test.com") .profileImage("ex") .nickname("ex") .isOnline(false) .type("kakao").build(); User save = userRepository.save(user); System.out.println(save.getId()); } User 객체를 하나 생성하고 save를 진행한다. 그..
· 기타
JPA로 테이블을 설계하면서 우선 지킬 것이 몇 가지 있었다. 1. 일단 LAZY로 선언 EAGER로 선언하면 연관 관계에 있는 Entity까지 전부 쿼리를 날려서 조회하기 때문에 쓰이지 않는 경우에 너무 자원 소모가 심하다고 생각했다. 그래서 프록시 객체로 조회하도록 LAZY를 우선으로 사용했다. 2. 연관 관계를 사용해야 할 경우 FETCH JOIN을 사용해서 하나의 쿼리로 처리하기. 결국 LAZY를 사용해도 해당 객체에 접근하게 될 경우 쿼리를 날려서 가져오게 되면서 N+1 문제가 발생한다. 이를 방지하기 위해 FETCH JOIN을 사용해서 하나의 쿼리로 연관 관계에 있는 객체를 가져오도록 만들었다. 그러다가 문득 FETCH JOIN을 안쓰면 진짜 쿼리가 N+1로 날라가는지 궁금해서 테스트를 해봤다..
· 기타
기존 프로젝트에서도 JWT랑 시큐리티, Oauth를 사용했지만 이번에는 jwt 저장 방법을 변경해보려고 한다. 기존 방법 액세스 토큰 -> json으로 넘겨서 클라이언트가 로컬, 세션 스토리지에 저장해서 관리. 리프레시 토큰 -> 쿠키에 저장해서 secure, httpOnly, sameSite 옵션을 걸음. 리프레시 토큰은 쿠키에 저장해서 보안성을 챙겼지만 액세스 토큰을 스토리지에 저장한다는 게 마음에 걸렸다. 그래서 액세스 토큰도 쿠키에 같이 저장하기로 하였다. 변경 방법 아래 설명은 스프링부트 Oauth 라이브러를 사용해서 successHandler까지 도달했다는 가정 하에 진행한다.(즉 인증코드를 액세스 토큰으로 바꿔서 접근 권한을 획득한 상태) @Override @Transactional publ..
· 기타
Lombok 이란? Lombok은 Java의 라이브러리이다. 자바 클래스에서는 Getter, Setter, toString() 등 여러 번 반복해서 사용하게 되는데 사실 클래스마다 이거 매번 만들어주기가 많이 귀찮아진다. 그래서 어노테이션만 넣어주면 기능을 이용할 수 있게 만들어놓은 라이브러리이다. 1. 롬복 설치하기 윈도우 기준 File -> Settings로 들어간다. 검색칸에 plugins 검색하고 Lombok을 검색해준다. 이게 인텔리제이 2020.03 이후부터는 Lombok이 자동으로 깔려있다. 2. Dependency 설정하기 build.gradle에 들어가서 아래 코드를 넣어준다. group = 'hello' version = '0.0.1-SNAPSHOT' sourceCompatibility..
indeep
'기타' 카테고리의 글 목록