템플릿 메서드 -> 전략 패턴 public interface BoardStrategy { BoardResponseDto createPost(BoardRequestDto dto, U userInfo); BoardResponseDto updatePost(BoardRequestDto dto, U userInfo, Long id); void deletePost(U userInfo, Long id); CommentResponseDto createComment(Long boardId, CommentRequestDto dto, U userInfo); void deleteComment(Long boardId, Long commentId, U userInfo);}기존의 템플릿 메서드 패턴에서 전략 패턴으로 구조를 바꿔보았다.. 2025. 1. 3. DDD와 객체지향에 대한 생각 3-layer architecture로 개발을 하다가 좋은 패키지 구조에 대한 갈증을 느껴서 시작한 DDD가 생각보다 어려운 것 같다.현재 내 DDD 패키지구조를 살펴보면 이러하다.interface layer의 controller는 app layer에 의존하며 service를 호출시켜 client에게 dto를 반환하거나, validation, exception을 처리하거나, session을 체킹한다.app layer의 service는 domain layer에 의존하며 domain model class에 있는 정적 팩토리 메서드 또는 repository를 호출해 새 객체를 만들어서 crud를 수행한다.그리고 domain layer는 그저 존재한다언뜻보면 꽤 괜찮은 듯 하지만 aggregate root가 겨.. 2024. 12. 18. 튜터님의 피드백2 1.세션을 User 엔티티로 저장하고 확인하는데 굉장히 문제가 많다. DDD개념과도 충돌한다.사실 예전에 dto로 묶으려다 안돼서 그냥 User로 냅뒀는데 UserId로 string으로 처리해야겠다. 코드 다 갈아엎어야한다. 하하 2.그 외 추천도서: 객체지향의 사실과 오해(토끼책)object 오브젝트테스트 주도 개발토비의 스프링 3.공부할거리프록시, transaction의 흐름, acid원칙, transactional과 1차캐시의 사용 2024. 12. 17. Redis queue, Spring scheduler + ratelimit 트러블슈팅 원래 updateViewCount 코드의 문제: 그냥 async만 사용해서 비동기적으로 처리하고있다. 하지만 대량의 요청이 들어오면 서버 리소스가 낭비된다거나, 카운팅이 중복될 수 있다. 따라서 분산 처리를 효율적으로 할 필요가 있었다. 해결방법: redis queue와 spring scheduler를 이용해 요청이 있을 때 마다 redis queue에 담고, batch 처리를 통해 일정 시간마다 한번에 반영한다.@Service@AllArgsConstructorpublic class BoardQueueService { private final RedisTemplate redisTemplate; public void addToQueue(Long boardId){ redisTempla.. 2024. 12. 17. 튜터님의 피드백 1. DDD에서의 domain은 repository 등 다른 파일에 의존하지 않아야 한다. DDD를 사용하기보단 3-Layer Architecture도 공부할 거리가 많으니 사용해봐라. DDD는 domain내부에서만 상호작용 해야한다. service검증로직(validtate) 등은 repository가 아닌 user객체로 진행해라. (하지만, DDD 본것중에 거의 제일 잘 썼다 2. get요청에 대한 캐시메모리는 기본적으로 브라우저에서 지원하므로 cache를 사용하는것은 비효율적이다. 거기다, cache를 남용하면 비용이 엄청나다. 기본적으로 redis를 사용하는 이유는 매우 빨라서이고, 단순 cache에 국한되기보다는 다양한 시스템에 많이 사용될 수 있다.메모리에 관한 공부가 필요하다. '운영체제' .. 2024. 12. 17. Redis Insight 테스트코드 없이 테스트 작업을 진행 하면서(.. 테스트코드 공부해야되는데..)redis cache에 대한 직관적인 확인이 필요해졌고, 캐시를 한 눈에 모아볼 수 있는 도구인 redis insight gui에 대해 알게되었다. redis를 실행하고 insight를 실행하면 정상적으로 캐시들이 보이고, 편하게 테스트 할 수 있다.원래 캐시가 꽤 많았는데 테스트 다시 하려고 다 지운 상태다 ㅎ 이제 요 며칠 간 열심히 만든 api들을 테스트 해보자!목표는 캐싱 작업이 정상적으로 진행되는걸 내 눈으로 보는것이다.그리고 swagger가 있음에도 왜 사람들은 postman을 사용하는가? 에 대해 튜터님께 여쭤봤는데, postman이 테스트 기록도 남고 코드에 주는 영향도 적고 확실히 사용이 편하다고 하셨다.post.. 2024. 12. 16. CustomCache(Spring AOP + RedisTemplate) AOPAOP는 관점 지향 프로그래밍의 약자로, 핵심 비즈니스 로직과 부가적인 기능을 분리해서 코드를 더 깔끔하고 유지보수하기 좋게 만드는 프로그래밍 기법이다. XML설정 또는 어노테이션 기반으로 부가기능을 손쉽게 선언 가능하고, 공통 기능을 한 곳에서 관리하므로 변경이 필요할 때도 그 곳만 수정하면 된다. 1.관점(Aspect)공통된 기능을 하나의 모듈로 정의한 것. 로깅, 트랜잭션, 보안 등과 같은 기능은 여러 클래스나 메서드에 중복적으로 나타나는데, 이를 한 곳에서 정의하고 관리하는 것이 Aspect이다. 2.타겟(Target)AOP가 적용될 대상 클래스 또는 메서드다. @service 또는 @repository클래스의 특정 메서드가 AOP의 대상이 될 수 있다. 3.조인 포인트(Join Point).. 2024. 12. 15. 템플릿 메서드 패턴 현재 코드의 문제 : 같은 로직(validateUser)가 모든 crud 메서드에 중복 구현되어있다.위: 로그인 사용자용 createPost 메서드아래: 비로그인 사용자용 create, updatePost 메서드 user검증로직이 중복되며, 캡슐화 하는것이 좋다. 해당문제를 해결하기 위한 "템플릿 메서드 패턴" 을 적용시켜 보았다.https://refactoring.guru/ko/design-patterns/template-method 템플릿 메서드 패턴/ 디자인 패턴들 / 행동 패턴 템플릿 메서드 패턴 다음 이름으로도 불립니다: Template Method 의도 템플릿 메서드는 부모 클래스에서 알고리즘의 골격을 정의하지만, 해당 알고리즘의 구조를 변경하refactoring.guru요즘 자기 전에 보는 .. 2024. 12. 15. DDD(Domain-Driven Design) DDD란? 소프트웨어의 복잡성을 줄이고, 도메인 로직을 중심으로 개발을 진행하기 위해 계층화된 파일 구조다. 대표적으로 domain - 애플리케이션의 핵심 비즈니스 로직application(애플리케이션 계층) - 유스케이스 구현, 도메인 계층 호출infrastructure(기술적 계층) - db, 메시징 시스템, 외부api, 파일 시스템 등 외부 기술과의 통합을 담당interfaces - 사용자와 상호작용하는 인터페이스. rest api, 웹 페이지, cli 로 이루어져있다. DDD는 SRP를 완벽히 따르며, 도메인 모델을 가장 중요하게 여긴다.도메인 로직은 domain 계층에 집중해야 하며, 다른 계층에 의존하지 않는다.계층 간의 의존성 흐름은 interfaces -> application -> dom.. 2024. 12. 13. 이전 1 2 다음