728x90
반응형

전체 글 143

변성

자바 변성 (Variance) 자바의 가변성에는 크게 공변, 무공변, 반공변이 존재한다. 제네릭을 잘 사용하려면 이 가변성에 대한 이해가 필요하다. 변성을 제대로 이해하려면 "타입 S가 T의 하위 타입일 때, Box[S]가 Box[T]의 하위 타입인가?" 라는 질문에서 시작하는게 좋다. 배열은 공변, 제네릭은 무공변이 기본이라고 다들 알고 있을 것이다. 무공변 (Invariance) or 불공변 기본적으로 제네릭은 무공변이다. 무공변이라고 하니 헷갈리는것 같다. 사전적으로 번역해보면 불공변으로 나오게 된다. 타입 S가 T의 하위 타입일 때, Box[S]와 Box[T] 사이에 상속 관계가 없는 것 쉽게 말하면 너는너, 나는 나 인 느낌이다. 그래서 선언한 유형만 들어갈 수 있게 코드를 구성할 수 있다. O..

Java 2022.08.11

Jenkins 에러

Jenkins 위키백과에서 발췌한 내용에 따른다. 젠킨스(Jenkins)는 소프트웨어 개발 시 지속적 통합(continuous integration) 서비스를 제공하는 툴이다. 다수의 개발자들이 하나의 프로그램을 개발할 때 버전 충돌을 방지하기 위해 각자 작업한 내용을 공유 영역에 있는 Git등의 저장소에 빈번히 업로드함으로써 지속적 통합이 가능하도록 해 준다. MIT 라이선스를 따른다. 발생 시점 현재의 회사에서 배포를 젠킨스를 이용하여 배포를 진행한다. 신규 기능개발과 레거시를 청산하는 작업을 주로 해왔었어서 이쪽을 고치는게 우선은 아니었다. 그래서 모르고 있었던 것일수 있다. 에러 상황을 확인해보자 에러 상세 [Pipeline] End of Pipeline java.lang.InterruptedEx..

디버깅 2022.08.11

쿼리 개선 2

쿼리 속도 개선 1.6초 -> 0.4초 메타테이블과의 조인을 해서 정보를 얻어오는 과정 서로 논리적인 데이터베이스는 다른데 mysql에서 뷰 테이블을 사용하고 있음 그런데 유저 개개인의 데이터에서 매칭시키는 메타테이블의 idx 칼럼이 인덱스가 정해져있지 않았다. 그래서 유저 개개인의 데이터를 전부 조회해서 매칭되는 데이터를 추리고 있었다. 개선안 100개 이상의 row를 탐색하던 것이 25개만 탐색하는것으로 바뀐 실행이 나오게 된다. 그러면서 Extra가 제외되고 참조 정보가 인덱스로 가게 된다. 지금은 100개인 데이터였지만, 만약에 조회할 데이터가 10만 건, 100만 건 이렇게 늘어날 수록 시간은 증가했을 것이다. 진행중인 mysql 독서 스터디가 이런 생각을 하는데 도움을 많이 줬다.

배치 에러 개선기

업무에서 Spring Batch로 세미나를 진행하고, 앱 푸시 기능을 배치로 전환하는 작업을 진행했다.여기에 저장하면서 글로만 보던 것들을 직접 경험해보면서 겪었던 일들을 기록하려고한다.첫번째 에러우리 푸시 배치 서버의 구조는 스프링 스케줄러 서버에서푸시 서버의 api를 호출해서 해당 job들을 돌려주는 방식으로 구성이 되어있다.물론 이 부분을 새롭게 개편해야 하는것은 맞다ㅋㅋㅋ그래서 특정 시간이 되면 해당 job api로 호출을 하는데여기서 대략 총 데이터가 100,000건 정도 되는데 전부 동기 + 블록킹처리로 진행했다.그래서 스케줄러가 api를 쏘고 요청값이 최대 오래걸려도 limit을 30분을 잡았었다.그런데 100,000건의 데이터를 여러 로그를 쌓고, 푸시를 하는데까지 1시간이 넘게 걸렸었다...

Spring 2022.08.11

DDD 표현 영역과 응용 영역

도메인을 제대로 만들지 못하면 요구사항을 충족하는 소프트웨어를 만들기란 힘들다는 것을 잘 알고있다. 도메인 영역은 기본 패시브로 잘 구현하되, 거기에 도메인에 활력을 불어넣어줄 표현영역, 응용영역도 잘 구현이 되어야 한다. 표현 영역 표현 영역은 사용자의 요청을 해석한다. 스프링으로 따져 생각해본다면 Controller로 생각하면 될 것 같다. DDD에서 말하는 패키지 구조로 보면 interfaces가 될 것이다. 표현 영역은 URL, 요청 파라미터, 쿠키, 헤더 등등을 이용해서 클라이언트에서 원하는 작업을 받아서 응용 영역에 처리를 위임시킨다. 응용 영역 응용 영역은 표현 영역의 요청을 받아 처리를 하는 Service로 생각해볼 수 있다. 표현 영역에서 전달 받은 데이터는 일단 신뢰할 수 없는 데이터이..

아키텍처 2022.08.11

DDD 도메인

도메인 도메인은 구현해야할 소프트웨어의 대상이다. 쇼핑몰을 생각해보면 쇼핑몰은 대상, 그리고 상품조회, 주문, 배송, 결제 등등이 하위 도메인이 된다. 그리고 도메인이라고 해서 고정된 하위 도메인이 존재하는건 아니다. 결제같은것을 PG사에 위임하니까 말이다. 도메인 모델 패턴 기존의 나는 흔히 말하는 MVC 레이어 아키텍처를 사용했다. 이미지 출처 바로가기 단순히 Controller, Service, Repository세개를 사용해서 구현했었다. 이것은 내가 넥스트스텝에서 TDD와 클린 코드를 수강했어도 변하지 못했다. 근데 이 방식이 아니라 DDD책을 보면서 주워들었던 도메인 모델 패턴을 봤다. 그래도 말만 바뀌었지 느낌은 전과 같았다. 의존은 화살표 방향으로 주입이 된다. Presentation 사용..

아키텍처 2022.08.11

쿼리 작성 및 최적화

Real Mysql real mysql 책을 읽으면서 스터디 한 내용을 정리하고자 한다. 일단 11.1 부터 11.3까지의 내용만을 정리했다. 내가 사용하는 애플리케이션에서 특정 데이터를 테이터베이스에 저장하거나 조회를 할 때 SQL이라는 문장을 사용해야 한다. 데이터베이스의 테이블이나 구조를 변경할때는 DDL(데이터 정의 언어) 테이블의 데이터를 조작을 위한 언어는 DML(데이터 조작 언어) 이다. SQL작성 규칙은 mysql의 서버 시스템 정책에 따라 바뀔 수 있다. 이 정책은 데이터베이스에 어떤 테이블의 데이터들이 들어가지 않았을 때 설정하는 것이 중요하다. 영문 대소문자 구분 Mysql에서는 설치된 운영체제에 따라서 대소문자를 구분하는데, DB의 테이블이 디스크의 디렉토리나 파일로 매핑이 되기 때..

프로세스 상태

사용자가 프로그램을 실행시키면 메모리에 올라가며 프로세스가 실행된다. 지금의 컴퓨터는 수많은 프로세스들이 실행된다. 시분할 시스템이 사용되는 운영체제에서는 여러개의 프로세스를 돌아가면서 실행한다. cpu가 병렬적으로 여러 프로세스를 막 실행시키는것이 아니라, 한 순간에 하나의 프로세스만 처리가 가능하다. 그렇지만, 그 속도가 우리가 눈치챌 수도 없을 만큼의 속도로 분할되어 실행되기 때문에 여러 프로세스가 동시에 실행되는것 처럼 느끼게 한다. 프로세스는 시분할 시스템 처리를 위한 5가지의 상태가 존재한다. 생성 이 상태는 PCB를 생성하고, 메모리에 프로그램 적재를 요청한 상태 메모리에 프로그램 적재를 승인받으면 준비상태로 넘어간다. 준비 CPU를 사용하기 위해 기다리고 있는 상태 준비 상태의 프로세스는 ..

CS/운영체제 2022.08.10

@Valid, @Validated 차이

@Valid @Validated 차이 @Valid @Valid는 JSR-303표준 스펙이다. org.hibernate.validator.internal.constraintvalidators 안에 구현된 여러 Validator 구현체들로 인해 값을 검증해준다. 이의 핵심은 LocalValidatorFactoryBean 이며, 나는 스프링 부트를 사용하였기 때문에 자동으로 구성이 된다. 동작 원리 기본적으로 컨트롤러에서 @Valid가 없더라도 유효성 검증을 처리하는 로직을 지나간다. 이유는?? InvocableHandlerMethod는 적절한 파라미터 처리기를 찾으려고 HandlerMethodArgumentResolverComposite로 보낸다. 얘가 처리해줄 resolver를 찾는데 getArgument..

Spring 2022.08.10
728x90
반응형