본문 바로가기

분류 전체보기510

[solvesql] SQL 문제 풀이 (4) 1. 쇼핑몰의 일일 매출액과 ARPPU select date(ood.order_purchase_timestamp) as dt, count(distinct (ood.customer_id)) as pu, round(sum(oopd.payment_value), 2) as revenue_daily, round( sum(oopd.payment_value) / count(distinct (ood.customer_id)), 2 ) as arppu from olist_orders_dataset ood join olist_order_payments_dataset oopd on ood.order_id = oopd.order_id where ood.order_purchase_timestamp >= '2018-01-01' g.. 2023. 2. 1.
[solvesql] SQL 문제 풀이 (3) 1. 최고의 근무일을 찾아라 select day, sum(tip) as tip_daily from tips group by day order by tip_daily desc limit 1; 2. 버뮤다 삼각지대에 들어가버린 택배 select date(order_delivered_carrier_date) as delivered_carrier_date, count(*) as orders from olist_orders_dataset where date(order_delivered_carrier_date) between '2017-01-01' and '2017-01-31' and order_delivered_carrier_date is not null and order_delivered_customer_dat.. 2023. 1. 31.
[solvesql] SQL 문제 풀이 (2) 1. 레스토랑 웨이터의 팁 분석 select day, time, round(avg(tip),2) as avg_tip, round(avg(size),2) as avg_size from tips group by day, time; 2. 최근 올림픽이 개최된 도시 select year, upper(substring(city,0,4)) as city from games where year >= 2000 order by year desc; 3.우리 플랫폼에 정착한 판매자 1 select seller_id, count(distinct(order_id)) as orders from olist_order_items_dataset group by seller_id having orders >= 100; 2023. 1. 30.
[solvesql] SQL 문제 풀이 1. 모든 데이터 조회하기 https://solvesql.com/problems/select-all/ select * from points; 2. 일부 데이터 조회하기 https://solvesql.com/problems/select-where/ select * from points where quartet = 'I'; 3. 데이터 정렬하기 https://solvesql.com/problems/order-by/ select * from points where quartet = 'I' order by y; 4. 데이터 그룹으로 묶기 https://solvesql.com/problems/group-by/ select quartet, round(avg(x),2) as x_mean, round(variance(.. 2023. 1. 29.
[CS] 트랜잭션(Transaction) 이란? 트랜잭션의 정의 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위, 한꺼번에 수행되어야 할 일련의 연산입니다. 정의를 이해해보면, DB 의 데이터에 접근해 변경을 시도하는 작업(기능) 이라고 이해할 수 있습니다. 먼저 트랜잭션의 예시로 A의 계좌에서 B 의 계좌에 입금하는 작업을 들어보겠습니다. 1. A 의 계좌를 확인합니다. 2. A의 계좌에서 10000원을 B 계좌로 입금합니다. A의 잔액에서 -10000원을 차감하고 저장합니다. 3. B의 계좌를 확인합니다. 4. B의 계좌에 10000원을 더하고 저장합니다. 위처럼 하나의 작업을 진행하는데 이것을 트랜잭션이라고 합니다. 예시를 보니 트랜잭션의 필요성을 생각해볼 수 있습니다. 실패했을 때 만약 잔액이 원상복구 되지 않으.. 2023. 1. 28.
List 타입을 Page 타입으로 리팩토링 현재 JPA 를 이용해서 페이징 기능을 사용하고 있으나, 불필요한 Response 생성 및 API 를 클라이언트에게 보내줄때 좀 더 편리하게 사용할 수 있도록 리팩토링을 하려고 합니다. 먼저 현재 코드를 보면 아래와 같습니다. 이전에 가장 중요한 것은 어떤 반환값이든 엔티티를 반환값으로 사용하지 않습니다. 엔티티가 변경되면 API 를 사용하고 있는 화면에 장애가 발생할 수 있기 때문에 Dto 클래스를 필수로 사용합니다. List 타입을 갖고 있는 것을 볼 수 있는데, GoodsPageResponse를 따로 만들어준 이유는 페이징에 필요한 정보만 축약해서 응답해주려고 만들었습니다. // 상품 전체 조회 @GetMapping("/goods") @ResponseStatus(HttpStatus.OK) @ApiO.. 2023. 1. 28.
JPA N+1 문제 알아보기 프로젝트에서 페이징이 걸려있는 상품 전체 조회 및 키워드로 검색할 시에 N + 1 문제가 발생하여 해결방법에 대해 알아보고자 한다. 현재 Goods 엔티티에서는 2개 이상의 컬렉션이 있고, 페이징이 걸려있기 때문에 fetch join으로 해결할 수 없어 batch size를 통한 방법을 알아보았다. 뿐만 아니라 N+1 문제의 원인 , 해결방법에 대해 학습한 내용을 정리하려고 한다. N+1 문제로 인해 대량의 데이터가 있는 애플리케이션이 아니라면 성능에 상관없이는 그냥 지나칠 수 있는 문제이지만,성능 개선을 위해서는 필요한 지식이라고 생각한다. 학습하면서 생각해보았다.상황에 맞추어 적절한 방법을 선택해야겠지만, 지연로딩은 필수로 사용하며 페이징과 List 컬렉션을 사용해야 한다면 Batch Size 를 사.. 2023. 1. 25.
Ehcache 2 -> Ehcache 3 마이그레이션 이전에 Ehcache2 로 적용해보았는데, 3으로 마이그레이션 해보았다. 이유는 버전 3이 적극적으로 유지 관리되고 개발된 버전이며, 유형이 안전하고 JSR107과 호환된다고 한다. (JSR107 : Java 캐싱 API https://github.com/jsr107/jsr107spec ) https://stackoverflow.com/questions/47163873/difference-relationship-between-ehcache-v2-and-ehcache-v3 Difference / Relationship between EhCache v2 and EhCache v3 Recently I am doing some research about the performance of java local ca.. 2023. 1. 23.
Spring Security + JWT 로그인 구현하기 (Access Token) 스프링 시큐리티의 구조 및 JWT로 구현하는 예제는 정말 많다. 정말 어려운 부분이면서 깊이가 상당한 라이브러리를 시작하기 위해서 따라해보고 첨삭을 통해 프로젝트에 필요없는 코드는 제외했다. 또한, 리프레시 토큰도 처음에는 구현했으나, 제외하고 엑세스 토큰만 구현했다. 1. 가장 기본이 되는 엑세스 토큰으로 구현하고 필요할 때, 리프레시 토큰을 사용하는 것이 옳은 방법이라고 판단했다. ( 로그인만 사용하는 단계에서 그 이상으로 구현할 때, 해당 코드에 대해 자세히 분석하지 못하고 구현하거나 그 이상으로 복잡해지면 이후 리팩토링 하는 과정이 더 힘들것이라고 생각했다 ) 2. 리프레시 토큰을 탈취당하면 엑세스 토큰을 탈취당하는 것보다 이상의 문제가 생길것이라고 판단했다. 3. 기준은 없지만, 엑세스 시간을 .. 2023. 1. 23.