[Spring] 스프링 AOP - 1
·
Dev Framework/Spring
스프링 AOP(Aspect Oriented Programing)스프링의 핵심 철학 '비침투성'스프링은 EJB 같은 무거운 프레임워크가 주류이던 시절에 등장했습니다. 여기서 말하는 EJB는 Spring 이전에 주로 사용되던 자바 엔터프라이즈 애플리케이션 프레임워크입니다.그때의 프레임워크들은 다음과 같은 문제가 있었습니다.도메인 로직이 프레임워크 코드와 강하게 결합비즈니스 로직을 작성하려 해도, 상속 구조나 라이프사이클에 제약을 받아야 했음테스트하려면 컨테이너를 띄워야만 가능스프링 창시자인 Rod Johnson은 이 문제를 해결하고자 스프링을 설계하면서 이런 철학을 전면에 내세웠습니다."J2EE should not invade your domain model. Your domain model should b..
[JPA] JPA 영속성 컨텍스트 with 프록시 - 2
·
Dev Framework/Spring
프록시프록시란?JPA에서 말하는 **프록시(Proxy)**는 실제 엔티티 객체를 감싸고 있는 가짜 객체(대리 객체)입니다.이 프록시는 실제 객체처럼 행동하지만, 내부적으로는 실제 객체를 참조하지 않은 상태로 존재합니다.실제 객체가 필요한 순간(=속성 접근)까지는 DB에 접근하지 않고 대기하다가,속성이 호출되는 시점에 DB에서 데이터를 조회해서 영속성 컨텍스트에 등록하고, 실제 객체처럼 행동합니다.Member member = entityManager.getReference(Member.class, 1L);System.out.println(member.getClass());// class com.example.Member$HibernateProxy$...System.out.println(member.getN..
[JPA] JPA 영속성 컨텍스트 완전 정복 - 1
·
Dev Framework/Spring
영속성 컨텍스트1. 영속성 컨텍스트 정의영속성 컨텍스트란, 엔티티(Entity)를 저장하는 가상의 메모리 공간(1차 캐시)입니다.Java Persistence API(JPA)에서 엔티티 객체를 영구 저장소(데이터베이스)에 저장하거나 조회할 때, 직접 DB와 바로 통신하는 것이 아니라, 중간에 있는 영속성 컨텍스트를 통해 처리합니다. 2. 영속성 컨텍스트의 역할역할설명1차 캐시엔티티를 메모리에 저장해두고 동일한 엔티티 재조회 시 캐시에서 반환동일성 보장같은 트랜잭션 내에서는 같은 엔티티 인스턴스를 보장 (== 비교 가능)변경 감지 (Dirty Checking)엔티티 값이 변경되면 트랜잭션 종료 시 자동으로 UPDATE 쿼리 생성지연 로딩 (Lazy Loading)연관 엔티티는 실제 사용할 때까지 SQL을 ..
[트러블 슈팅] 회원 600명 부하테스트 진행하기 with K6
·
WEB/트러블슈팅
시험기간은 2주 하루에 예약 수용 가능한 인원은 최대 600 여 명오전 8시에 예약이 오픈됩니다. 모든 스터디룸은 시험기간인 이유로 개인석 단위로 예약이 진행됩니다.이전 스터디룸을 오픈 톡방을 통해서 예약을 진행했었는데 150명 가량 신청했던 기억이 있습니다.모든 시간대를 동시다발적으로 예약한다면 저희 프로젝트의 WAS는 부하를 버틸 수 있는지 테스트를 해야합니다.하루에 예약이 가능한 인원은 방 별로 SQL 문으로 확인해보니 아래와 같았습니다.아래 데이터에 따르면 600여명이 예약이 가능합니다. 과연 우리 서버는 모든 인원을 수용할 수 있을까라는 의문이 들었습니다.SELECT room_number, SUM(capacity)FROM scheduleGROUP BY room_number+-----------+..
[트러블 슈팅] 외부에서의 redis 접근으로 인한 복제 노드로 변환되는 문제
·
WEB/트러블슈팅
문제 및 원인Caused by: io.lettuce.core.RedisReadOnlyException: READONLY You can't write against a read only replica. at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:144)서버 에러가 발생하였습니다. redis의 노드가 복제로 인해서 readonly로 바뀌었다는 로그를 확인할 수 있었습니다.저희 시스템은 redis를 refresh token을 저장하는 용도로 사용하고 있습니다. redis에 쓰기 접근이 안되기에 로그인이 불가한 상황이었습니다.더군다나 저희는 복제를 활용하는 sentinel이나 클러스터 ..
[프로그래머스][Python] 문자열 압축
·
코드트리
https://school.programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 코드def solution(s): answer = 1000 length = len(s) if length == 1: return 1 for num in range(1, len(s)): total = length % num time = length // num idx = 0 cnt = 1 word = "" while idx ..
[프로그래머스][Python] 주차 요금 계산
·
코드트리
https://school.programmers.co.kr/learn/courses/30/lessons/92341 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 코드IN = "IN"OUT = "OUT"day_to_minute = "23:59"def solution(fees, records): answer = [] basic_time, basic_fee, per_time, per_fee = fees total_time_record = dict() in_out_record = dict() def clock_to_minute(clock): h, m = map(i..
[프로그래머스 SQL] 조건에 맞는 개발자 찾기
·
프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/276034 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 코드SELECT DISTINCT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAMEFROM SKILLCODES S JOIN DEVELOPERS D ON (S.CODE & D.SKILL_CODE) = S.CODEWHERE S.NAME IN ('Python', 'C#')ORDER BY D.ID 쿼리 실행 순서JOIN → FROM → WHERE → SELECT → ORDER BY로 진행됩니다.특정 스킬이 개발자의 스킬코드 안에..
개발자 성현