전체 글 333

실전 프로젝트 - 22일차

Spring batch batch = 일괄처리 라는 뜻을 지니고 있음 집계기능을 가지고 있고 이것은 하루에 한 번 수행된다. 단발성으로 대용량 데이터를 처리하는 어플리케이션을 배치 어플리케이션이라고 한다 Spring 진영에서는 Spring Batch가 존재한다. 배치 어플리케이션은 만족해야하는 조건이 있다. 대용량 데이터 - 대량의 데이터를 가져오거나, 전달, 계산 등의 처리를 할 수 있어야한다. 자동화 - 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 한다. 견고성 - 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 한다. 신뢰성 - 무엇이 잘못되었는지를 추적할 수 있어야 한다. (로깅, 알림) 성능 - 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도..

실전 프로젝트 - 21일차

Meta Annotation (@Target, @Retention) 로깅과 AOP를 설정할 때 주로 사용되는 @Target과 @Retention에 대해 알아보자! Meta - Annotation이란? 다른 Annotation에서도 사용되는 Annotation의 경우를 말하고 custon - annotation을 생성할 때 주로 사용한다. @Service 어노테이션은 Bean으로 등록해주기 위해 @Component를 가지고 있는 형태로써, 여기서는 @Component를 Meta - Annotation이다. @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface ParamToDto { } 이렇게 사용이 된다. @..

실전 프로젝트 - 20일차

멀티 프로세스와 멀티 스레드 멀티 프로세스 멀티 프로세스는 하나의 프로그램을 여러 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 환경이다. 프로세스는 하나의 운영체제로부터 CPU시간, 주소공간, 독립된 메모리 영역(code, data, stack, heap)을 할당 받는다. 각 프로세스는 독립된 주소 공간에서 실행되어 다른 프로세스의 주소 공간에 접근할 수 없다. (독립적) 각 프로세스 간 IPC(Inter-Process-Communucation)를 사용해 데이터를 주고 받는다. 하나의 프로세스가 잘못 되어도 프로그램은 동작한다. 브라우저 중 크롬 브라우저가 멀티 프로세스로 동작한다. 장점 독립된 구조이기에 안정성이 높다 한 프로세스가 죽어도 다른 프로세스가 영향을 받지 않는다. 대신 느려질 ..

실전 프로젝트 - 18일차

오늘의 문제는 데이터 검색 시 공백 (띄어쓰기 2칸) 입력 방지와 keyword가 없으면 검색이 불가능하게 해야했던 것! 오래간만에, 프로젝트 초기의 느낌으로 돌아가 HTML을 만져야했다. 공백 검색의 이유는 공백 검색 시 에러가 발생하는 이유 때문에 공백 검색을 막아줘야했다. 코드 수정으로 바로 들어가보자. 기존 input 코드에서 style 뒤에 onkeyup과 onchange을 입력해준다. js를 사용해 function 을 생성해준다. function noSpaceForm(obj) { let str_space = /\s{2}/; // 공백 2칸 체크 if (str_space.exec(obj.value)) { alert("공백을 사용할 수 없습니다."); obj.focus(); obj.value = ..

실전 프로젝트 - 17일차

커버링 인덱스(Covering index) & 복합 인덱스 Prac Test_1 복합인덱스는 카디널리티가 낮은 순으로 인덱스 생성 커버링 인덱스 적용 X select * from book where title = '가나' group by category, babyCategory, title; 3회 test 평균 = 1m 24s... Test_2 복합인덱스는 카디널리티가 낮은 순으로 인덱스 생성 커버링 인덱스 적용 O select category, babyCategory, title from book where title = '가나' group by category, babyCategory, title; 3회 test 평균 = 24s... Test_1에 비해 검색 성능 약 3.3배 향상 Test_3 복합인..

23.03.20 - 03.26 -WIL

1. 검색하는 필터가 다양한데 엘라스틱서치 도입 전에 인덱스를 어떻게 활용해서 검색을 할 수 있을지? 답변 : 단순 검색은 full-text, 필터는 복합 인덱스? 여전히 고민중이다. 피드백 : 복합 인덱스는 여러 개여야 한다. 어떤 순서로 나열할 지는 데이터의 카디널리티를 잘 고려해서 어떤 인덱스를 왜 만들었는지 고민하는게 필요하다. 인덱스의 동작하는 방식을 이해하는 것이 중요하다! 그 후에 엘라스틱 서치로 넘어가는 것이 좋다고 생각한다. 추가적으로 테스트 기록할 때 JMeter를 이용하면 다양하고 좋은 테스트 결과를 얻을 수 있다. 2. 동시성 이슈에 대한 테스트는 어떻게 진행해볼 수 잇을지? 답변 : 앞 조랑 비슷. 3. 책 랭킹에 대한 프로세스는 어떻게 진행될지? 답변 : 레디스, RDS, 배치 ..

실전 프로젝트 - 15일차

1. .CSV insert 시 id mapped by => inventory 해당 오류는 DB에 데이터를 넣는데 계속 오류가 발생하면서 데이터 주입이 안됌 몇시간을 혼자서 하다가 포기하고 자버림. 아침에 팀원들한테 물어보니..ㅋㅋㅋㅋ 정말 간단한 문제였음 id 컬럼에 mapped by 선택 부분이 inventory로 설정되서 데이터 주입시 오류가 발생 했던것.. 표시된 부분을 빈칸으로 두고 Auto inc 부분을 체크해주면 된다(원래는 체크 안되어있음) 정상적으로 데이터가 원활하게 들어감. 2. 데이터 불러오기 오류(main page 불러오기 실패) => Table name 매칭 x 해당 오류는 DB 테이블에 이름이 안맞아서 발생했던 오류.. 이것도 안되서 끙끙 앓다가 팀원들 호출.. 1번 상황과 똑같은..

실전 프로젝트 - 14일차

JMeter where = 조건절 기존 sql는 string이여서 넣고빼기가 힘듦 Jmeter 정리 Apache JMeter는 서버가 제공하는 성능 및 부하를 측정하는 테스트 도구 순수 Java 어플리케이션 오픈소스로 서버나 네트워크 또는 개체에 대해 과부하를 시뮬레이션 하여 강도를 테스트 하거나 다양한 부하 유형에서 전체 성능을 분석 특징 - 다양한 프로토콜/서버를 테스트 가능 웹(HTTP/HTTPS) SOAP/REST 웹 서비스 FTP 데이터베이스 Mail... - CLI 지원 CI CD 툴과 연동할 때 편리 UI를 사용하는것 보다 메모리 등 시스템 리소스를 적게 사용 성능 테스트 자동화 가능 - 시나리오 기반 테스트 가능 - 다양한 외부 플러그인 사용하여 기능 확장 가능 주요개념 - Thread G..

실전 프로젝트 - 13일차

DB에 데이터를 1000만개 넣고 main 페이지를 띄웠을 때, 데이터 양이 너무 많다보니페이지 로딩 시간이 40초 이상 걸렸다. 원인은 메인페이지에서 보여지는 데이터 양이 DB의 모든 데이터를 가지고와서 보여줬기 때문 해결 방법은 1000만 건의 데이터 중 몇 개만 random으로 가져와 보여줘야 했다 내가 생각한 방법은 DB에 random 쿼리를 날려서 랜덤으로 8개만 가지고 오려고 했다.@Query (value = "select * from {Table} order by RAND() limit 8", nativeQuery = true)List findAll();해당 쿼리를 작성하여 테스트를 해본 결과 그래도 시간은 꽤 오래 걸린다.. 방법을 찾다가 팀원에게 도움을 요청했다. 몇시간동안 해결하지 못했..

실전 프로젝트 - 12일차

// JPQL public List findAllByString(OrderSearch orderSearch) { String jpql = "select o From Order o join o.member m"; boolean isFirstCondition = true; //주문 상태 검색 if (orderSearch.getOrderStatus() != null) { if (isFirstCondition) { jpql += " where"; isFirstCondition = false; } else { jpql += " and"; } jpql += " o.status = :status"; } //회원 이름 검색 if (StringUtils.hasText(orderSearch.getMemberName()))..

728x90