728x90

JAVA 109

성능테스트 - 리팩토링

아키텍쳐 리팩토링 스케일 아웃 Scale outAWS 로드 밸런서를 사용해 애플리케이션을 여러 서버로 분산해 트래픽을 균형있게 분배하고 고가용성을 제공하는데 도움이 된다.  분산 시스템 아키텍쳐마이크로 서비스 아키텍쳐를 고려해 각 부분을 독립적으로 스케일 아웃한다. 확장성을 제공한다. 서버 리소스 최적화서버 리소스 (CPU, 메모리, 디스크) 를 최적화하고 운영체제 및 웹 서버를 튜닝한다.애플리케이션 리팩토링 캐싱 활용자주 접근하는 데이터를 캐시한다.  동일한 데이터에 대한 요청이 있을 때 마다 더 빠르게 제공할 수 있다캐시란? 데이터를 임시 저장하는 기술. 비동기 프로그래밍spring 의 비동기 서비스 및 메세징을 활용해 요청과 응답을 병렬로 처리하고 병목현상을 줄인다.비동기 프로그래밍이란? 동시에 작..

JAVA/프로젝트 2024.11.21

성능 테스트 - Locust 설치, 이론

intelliJ - new Projdct 에서 python 을 택한다.terminal 창에서pip install locust  locust 는 vscode Installer가 없으면 설치되지 않는다. 설치 후 진행.  스크립트를 작성한다. from locust import HttpUser, task, betweenimport randomclass AddPosts(HttpUser): wait_time = between(1, 2) def on_start(self): self.client.post("/members/sign-in", json={ "memberId":"member", "password": "1234" }) @task def add_post(self): s..

JAVA/프로젝트 2024.11.20

성능 테스트 진행- 테스트 종류와 툴, 진행할 시나리오

성능테스트?해당 어플리케이션의 성능, 확장성및 안정성을 평가하는 과정을 나타낸다.테스트의 목적은 어플리케이션의 부하 처리 능력, 응답시간, 처리량 및 자원사용량과 같은 성능 관련지표를 측정해 어플리케이션이 예상된 작업 부하 아래에서 어떻게 수행되는지 이해하는데 도움을 준다.  성능 테스트의 종류스트레스 테스트: 어플리케이션을 최대 부하에서 테스트하는 과정. 어플리케이션의 성능 한계를 확인하고 부하 처리 능력을 평가한다. 대량의 동시 사용자 또는 트랜잭션을 생성해 어플리케이션의 응답 시간과 자원 사용량을 모니터링한다.  스파이크 테스트: 갑작스러운 부하 증가에 대한 어플리케이션의 대응 능력을 테스트한다. 예를 들어 선착순 할인 이벤트 같은 이벤트로 인해 갑자기 많은 사용자가 어플리케이션에 접속하는 시나리오..

JAVA/프로젝트 2024.11.18

Spring Boot 에 Redis 설정, 캐시 적용, 조회

build.gradle에 추가implementation 'org.springframework.boot:spring-boot-starter-data-redis' application.properties에 추가spring.cache.type=redisspring.data.redis.host=spring.data.redis.port=spring.data.redis.password=spring.data.redis.repositories.enabled=false# spring.cache.redis.time-to-live=600000expire.defaultTime=36288000  mainApplication 에 추가@EnableCaching  RedisConfig class 를 만들어준다. import com...

JAVA/프로젝트 2024.11.17

로그인 AOP 적용

AOP?Aspect - Oriented - Programming스프링 프레임워크에서 제공하는 모듈. 관점 지향 프로그래밍의 구현을 지원하는 기술이다.AOP는 여러 모듈에서 공통으로 발생하는 관심사를 분리, 관리하며, 코드의 재사용성과 유지보수성을 향상 시키기 위해 사용된다. Aspect 관점: aop에서 관점이란 특정 관심사를 나타낸다.ex) 로깅, 트랜잭션, 보안.. JoinPoint 결합 지점: 어드바이스가 실행되는 시점. 예를 들어 메서드 호출이나 필드 접근 지점. PointCut 지점: 어드바이스를 적용할 결합 지점을 나타낸다. 정규 표현식이나 패턴을 사용하여 결합 지점을 정한다. Around 는 Advice 유형 중 하나로, 타겟 메서드를 감싸서 호출 전 후에 코드를 실행하게 해주는 어노테이션이..

JAVA/프로젝트 2024.11.16

대규모 트래픽을 고려한 프로젝트 기획 - 스택, 목적, 기능, 컨벤션, ERD

환경: JDK17, intelliJ기술: Spring Boot, Mybatis데이터: MySQL, redis성능 테스트: Locust, Python 프로젝트 목적:대용량 트래픽을 고려한 어플리케이션 개발(초당1000 tps 이상의게시글검색API)객체지향과 디자인패턴을 적용 및 가독성을 고려한 코드 작성 방법 공유현업 단계에서 코드리뷰를 어떻게 하는지 경험 공유모니터링 및 트러블 슈팅 전락 공유젠킨스 툴로 배포 자동화를 통해 개발 생산성 높이기 프로젝트 기획회원가입, 탈퇴아이디, 닉네임 중복 체크비밀번호 암호화로그인 로그아웃게시판카테고리 관리게시글& 파일추가, 삭제, 수정, 조회유저정보, 게시글제목, 게시글내용게시글검색기능댓글작성기능어드민공지글 추가 기능  커밋 컨벤션  브랜치 전략 - Git Flow 사..

JAVA/프로젝트 2024.11.14

리팩토링: 쿼리 줄이기

property 의 존재 유무만 확인하면 되는데default Property getById(Long propertyId) { return findById(propertyId) .orElseThrow(() -> new EntityNotFoundException(ErrorCode.NOT_FOUND)); }property의 모든 필드를 조회하는 것은 과하다고 생각이 되었다.  property의 id는  @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;auto increment설정이 되어 있어 자동으로 부여된다. 즉, id가 있으면 property 는 존재 property의 i..

JAVA/프로젝트 2024.09.12

리팩토링: 레디스 캐시 기능과 스케줄러를 통한 캐시 무효화

멘토님의 답변에 따라 리스트 조회에 캐시 기능을 추가@Cacheable(value = "sidebarList", keyGenerator = "keyGenerator") @Transactional(readOnly = true) public SideBarListResponse getSideBarList(Long propertyId) { LocalDate today = LocalDate.now(); Pageable pageable = PageRequest.of(0, 20); List sideBarPendingResponse = getPendingPropertiesDto(today, pageable); List complet..

JAVA/프로젝트 2024.09.12

리팩토링: DB 접근을 최소화하고 메모리에서 연산을 수행해 쿼리 감소

lms라면 false 를 반환하고, 그 외이면 true 를 반환하는 메서드를 작성했다 변경전: @Query("SELECT CASE " + "WHEN :medium = 'LMS' THEN false " + "ELSE true " + "END") boolean checkExtraConsultation(@Param("medium") String medium);db에 접근해 lms인지 아닌지 연산을 수행한다. 변경 후: default boolean checkExtraConsultation(String medium) { return !"LMS".equals(medium);db상호작용이 없고,  메모리 내에서 문자열을 비교해 결과를 반환한다. db접근이 줄어 성능적으로 더 좋고, 쿼리문도 약 50..

JAVA/프로젝트 2024.09.03
728x90
반응형