728x90
반응형

Java 79

배치 에러 개선기

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

Spring 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의 테이블이 디스크의 디렉토리나 파일로 매핑이 되기 때..

@Valid, @Validated 차이

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

Spring 2022.08.10

AOP

예제는 깃허브에 있다. AOP (Aspect Oriented Programming) AOP는 스프링의 핵심 구성요소중 하나이다. 관점지향 프로그래밍은 프로그램 구조에 대한 또 다른 사고방식을 제공하며 객체 지향 프로그래밍을 보완해준다. OOP의 모듈화 핵심 단위 클래스 AOP의 모듈화 단위 관점 (aspect) AOP는 횡단 관심사의 분리를 허용해주어 모듈성을 높이는 것을 목표로 하는 패러다임이다. 코드 자체를 수정하지 않고 기존 코드에 추가 동작을 추가해서 수행한다. 개념 그리고 용어 Aspect 여러 클래스에 중복되어 있는 관심사의 모듈화 대표적인 예로 트랜잭션 관리가 있다. Spring AOP 에서는 @Aspect를 사용한다. JoinPoint 메소드 실행이나 예외 처리와 같은 프로그램 실행중인 지..

Spring 2022.08.10

이진트리

이진 트리 순회 불과 반년전만 해도 이름만 들었지 마냥 먼곳에 있다고 생각했던 자료구조들이다. 근데 공부하면서 깨닫는 것은 뭐를 알아야 준비를 하고 공부도 하고 재밌게 문제도 풀 수 있다는 것이다. 그것이 바로 코딩테스트 😱 DFS니 BFS니 하려면 일단 스택, 큐, 배열, 재귀에 대해서 알아야된다고 생각했다. 물론 그리고 지금 포스팅하는 이 이진 트리에 대해서도 좀 짚고 넘어가야 한다고 봤다. 이진트리란? 이진트리는 각각의 노드가 아래 자식 노드를 최대 두개를 가진 트리 자료 구조이다. 위 이미지는 위키백과 에서 가져와봤다. 깊이(depth)는 3이고 크기는 9인 이진트리이다. 1 2 3 4 5 6 7 이런식으로 구성된 트리가 있을 때 전위 표기식으로 순서를 나타내는 알고리즘을 구성해보자 코드 publ..

CS/자료구조 2022.08.10

@ExceptionHandler

@ExceptionHandler 예외 처리기가 어떻게 동작하는지에 대해서 궁금했어서 업무중에 돌려보게 되었다. (예제코드는 다시 작성할 예정) 일단 동작과정은 DB에서 해당 id를 찾아 검색했을 때 없을 경우 예외를 던져주게 하는 예시 간단하게 보면 public class UserService { private final UserRepository userRepository; public User findById(final int id) { return userRepository.findById(id) .orElseThrow(() -> new NotFoundException("해당 유저를 찾을 수 없습니다")); } } 라고 로직을 구성했을 때 이 로직의 예외에 대한 핸들러 동작을 파보게 되었다. 일단 ..

Spring 2022.08.10

Select Sort 선택정렬

선택 정렬 (Select Sort) 선택 정렬은 현재 위치에 들어갈 데이터를 찾아 선택하는 알고리즘이다. 오름차순을 기준으로 정렬한다. 개념 제자리 정렬의 알고리즘 중 하나이다. 정렬 되지 않은 입력된 배열 외에 다른 메모리를 사용하지 않는다. 해당하는 n번째에 넣을 정렬된 원소 자리는 이미 정해져있고, 어떤 값을 넣을지를 선택하는 알고리즘이다. 동작 과정 주어진 배열에서 최솟값을 찾는다. 그 최솟값을 배열의 맨 앞의 수와 자리를 교체해준다. 맨 처음 값을 뺀 나머지 배열로부터 최솟값을 찾는다. 교체한 다음 맨 앞의 배열과 값을 바꿔준다. 이 과정을 정렬이 완료될 때까지 계속 반복한다. 보기 좋은 예시 이미지를 가져와봤다. 이제 그러면 구현을 해보도록 하자. Select Sort 구현 n 길이를 가진 배..

CS/알고리즘 2022.08.10

Service Layer에 대한 생각

Service Layer 이직하고 프로젝트에 대해 구조 파악을 하면서 리팩토링을 진행중에 좀 생각하게 된게 꽤많았다. 사실 서비스 레이어라고 해서 비즈니스 로직을 다 넣는건가? 또는 비즈니스 로직이 다 들어가 있는 것이다. 라는 얘기들이 많았다. 사실 나도 그렇게 생각했었던 사람중 1명이었다. 이게 근데 잘못된 생각이었다. 결국엔 사실 소스 코드를 다 분리하고 봐도 하나로 합쳐져서 동작하게 되는건 사실 맞다고 본다. 그러니까 다시 말하면 클래스 하나의 메소드에서 엄청나게 많은 줄을 가지고 개발을 할 수도 있다는 것이다. 근데 이거는 객체 지향 설계 관점에선 너무 안좋은 것이고 각자의 책임이 있을 것인데 그걸 분리한게 객체 지향인거다. Service Layer에 대한 오해 일단 이 서비스 레이어에서는 비즈..

Spring 2022.08.10

@Mock 사용기

📌 Service 레이어 테스트저번 퍼사드 패턴 적용기 에서언급했던 테스트에 대해서 써보려고 한다.바로 정리해보도록 하겠다.이전의 Mockito 에 대해서 정리한 글이 있다.📌 테스트 과정일단 퍼사드 패턴을 적용함으로써여러개의 서비스를 하나의 퍼사드가 관리해주는 형태로 작성을 했었다.그러면서 하나의 Service Repository가 되는 구조를 가지게 되었다.여기서 @Mock이 등장하게 되었는데,기존의 @Autowired 방식으로 사용했다면 꿈도 못꾸는 가짜 객체 주입이다.Service service = new Service(); 해서 @Autowired된 객체를 주입할 수 있을까?답은 아니라고 생각한다. 의존을 자동으로 주입해주기 때문에 뭘 할당할 수 없는 구조였다.하지만 생성자 주입을 해준다면?..

Spring 2022.08.10
728x90
반응형