🚪 들어가기에 앞서... 먼저, 이 포스트에서는 내가 얼마나 디자인 패턴에 대해서 열심히 공부했는지, 얼마나 많은 디자인 패턴을 아는지 보다 디자인 패턴으로 어떤 문제를 해결 했는지에 포커스를 맞춰 보고 싶다. 왜냐하면 디자인 패턴을 잘 알고 학습하는 것도 중요하지만, 디자인 패턴으로 어떤 문제를 해결 했는지가 더 중요하다고 생각하기 때문이다 디자인 패턴 각각에 대한 자세한 설명은 노션에 상세히 기록을 해 놓았다..! 😊 디자인 패턴에 대해서 학습하고 정리한 노션 링크 23가지 디자인 패턴에 대해서 | Notion 디자인 패턴이란 kaput-trombone-343.notion.site 1. 디자인 패턴 이란 디자인 패턴이란 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 해결책을을 말한다. SOL..
지난 1편에서 성능튜닝을 왜 해야하는지와 실행계획을 분석하는 방법에 대해서 살펴보았다. 실행계획의 정보를 보면서 어떤 것을 통해 성능을 개선할 수 있는지 약간은 감이 왔을 것이다. 그럼 이 분석한 실행계획을 바탕으로 정말 성능 개선을 해보자! ❓ 그럼 어떻게 실행되고 있는 SQL이 좋고 나쁜지 구분할 수 있을 까? 명확히 실행 계획 보고 성능 개선이 필요한지 선 그어 구분하긴 어렵다. 하지만 각자 상황에 맞게 검토 대상 추출이 필요하다. 자세한 내용은 노션을 참고하자. 위 실행계획의 특정 값에 대해서 설명하자면, 다음과 같다. 1. DEPENDENT SUBQUERY, DEPENDENT UNION (select_type) union, union all을 사용하는 서브쿼리가 메인 테이블의 영향을 받는 경우로..
나는 이번 Space Club 프로젝트를 진행하면서, SQL문을 작성하는 방식에 대해서 고민했었다. SQL 쿼리를 통해 같은 데이터 다루더라도 작성하는 방법은 여러 방법이 있는데, 내부적으로 DBMS 안에서 어떻게 작동되는지, 어떻게 SQL을 작성하는 것이 효율적인 방법인지 궁금했다. 일단 효율을 논하기 전에, 내가 프로젝트에서 썼던 MySQL 구조와 작동 방식부터 학습하는게 필수였다. 구조와 작동 방식보다도, 일단 왜 MySQL을 사용했는지에 대한 이해가 필요했다. 🤷 MySQL을 왜 프로젝트에서 사용했는가? 데이터베이스를 다루는 DBMS로는 여러 종류가 존재한다. 그 중, 관계형 DB는 1. 일반적으로 가장 많이 사용하는 데이터베이스이고, 2. 테이블 분리를 통해 중복값에 따른 성능 저하 방지 및 ..
문제 상황 Entity에서 key 생성 전략을 IDENTITY로 설정하면 auto_increment로 id가 null로 설정되어 DB에 INSERT이후, DBMS를 통해서 id 값을 받아 온다. 그런데, 이 auto_increment에 의존해 테스트를 위와 같이 작성할 경우, 각 테스트 마다 1부터 다시 id값을 생성하는게 아닌, 연속해서 id를 발행하기 때문에, auto_increment로 생성된 id에 의존해 테스트하는것에 문제가 생겼다. 아래 코드에서 보면, Template에는 id와 해당 template html을 저장한다. (아래는 template에 임의로 template 1,2를 넣어둔 것이다) 그래서 각 MailHistory는 어떤 template으로 보낼지 template이름을 가지고 있는..
Space club 프로젝트를 진행하는데 있어서 코드리뷰를 활성화 했다. 팀원들과의 코드리뷰는 직설적이고 간결하게 진행하는 것을 원칙으로 했다. 코드에 있어서 당연한 것은 없었다. 기능적으로 올바르게 동작하는 것은 필수적이였지만 어떻게 구현하는지, 어떠한 방식이 더 효율적인지 고민하는 것도 필수적이라고 생각했다. 위 팀원과 마주친 상황 다음과 같다. null 체크 할때 optional의 메서드를사용하는게 맞는가? 아니면 그냥 value == null 비교를 통해 검증하는게 맞는가? ❓먼저 나는 왜 Optional을 사용했는가 나는 null을 직접 다루는 것이 NPE에 있어서 위험하기때문에 null을 직접적으로 다루기보다 Optional 클래스를 통해 한번 wrapping해 사용하는 것이 낫다는 생각하에 ..
프로젝트를 진행하다 겪은 문제다. 람다식을 사용할 때, 특히 stream을 해 map으로 구조 변경 시 자기 자신을 인자로 넘겨주는 경우가 있는데, 이때 i -> i로 나는 그대로 넘겼다. 하지만 리펙토링을 하면서 Function.identity()와 i -> i 를 사용하는것의 차이가 무엇인지 궁금했다. @Override public Page findAllEventPages(Long userId, Pageable pageable) { Page eventPages = eventUserRepository.findAllByUserId(userId, pageable); List eventIds = eventPages.stream() .map(Event::getId) .toList(); Map eventUse..
1. 헥사고날 아키텍처(Hexagonal Architecture) 포트와 어댑터 아키텍처(Ports and Adapters Architecture)라고도 하며, 앨리스터 코오번 (Alistair Cockburn)이 개발했다 infrastructure(외부세계)로 부터 도메인 모델(비즈니스 로직)을 분리하기 위한 패턴이다. 그럼 domain과 infrastructure이 각각 뭘까? 도메인(domain)은 어플리케이션이 존재하는 이유이다. app의 본질이고, 차별성을 만드는 부분이다. 이 domain은 비즈니스 로직을 포함하고 있으며 데이터베이스나 web API나 프레임워크와 같은 기술로 부터 분리되어져야 한다. 인프라(infrastructure)는 기술을 나타낸다. 비즈니스 도메인이 아닌 나머지 모든 것..
이때까지 귀찮아서 Scanner만 항상 사용했는데, 이제야 정리를 해보고, 오늘 부로 절대 Scanner를 사용하는 과거로 돌아가지 않을 것이다. 1. Scanner Scanner는 띄어쓰기와 개행문자를 경계로 값을 인식하기 때문에 따로 가공할 필요가 없어 편리하다. 하지만 BufferedReader는 입력 받은 데이터가 String으로 고정되기 때문에 데이터를 원하는 타입으로 가공하는 작업이 필요하다. 알다시피 Scanner는 지원하는 메서드가 많다. 하지만 버퍼 사이즈가 1024 char이기 때문에 많은 입력을 필요로 할 경우에는 성능 상 좋지 못한 결과를 야기한다. (Scanner도 buffer 사용한다) 2. BufferedReader BufferedReader는 개행문자만 경계로 인식하고 입력받..
- Total
- Today
- Yesterday