Recent 🗞️
-
[Spring] Spring에서 요청 받는 법: @ModelAttribute vs @RequestParam - 컴도리돌이
API 요청을 받을 때 @ModelAttribute와 @RequestParam 어노테이션을 어떻게 사용해야 효과적인지, 각각의 차이점과 장단점을 비교해 보겠습니다. 이 두 어노테이션은 Spring에서 자주 사용되며, 요청 데이터를 받는 방식에서 중요한 역할을 합니다.@ModelAttribute@ModelAttribute는 객체 단위로 요청을 받을 때 유용합니다. 특히, 메인 페이지의 주요 리스트와 같이 여러 필드를 가진 요청을 받을 경우 유용하죠. 예를 들어, 클라이언트가 일부 필드를 빼먹거나 추가 필드를 보내더라도, @ModelAttribute는 기본적으로 없는 필드는 null로 처리하고, 불필요한 필드는 무시합니다.@GetMapping("list")public ResponseEntity getList..
더보기
-
[Spring] 컨트롤러 단위 테스트: @WebMvcTest와 @SpringBootTest의 선택과 활용 -컴도리돌이
작심삼주 오블완 챌린지오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.www.tistory.com작업한 로직을 테스트하기 위해 컨트롤러에 단위 테스트 클래스를 작성하고, @WebMvcTest로 URL에 요청 테스트를 시도해 봤습니다. 하지만 예상보다 많은 난관이 있어 처음에는 쉽게 진행되지 않았습니다. 특히 여러 서비스와 유틸리티 클래스들을 어떻게 처리할지에 대해 고민이 많았네요. 🥲No qualifying bean of type available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 위와 같은 에러가 발생하면서 테스트가 중단되었고, 이에 대한 해결책을..
더보기
-
[Spring] 단위 테스트에서 @WithUserDetails 사용하기: 발생한 에러와 해결 방법 - 컴도리돌이
작심삼주 오블완 챌린지오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.www.tistory.com단위 테스트를 작성할 때, 로그인 인증이 필요한 API 요청을 테스트하는 과정에서 @WithUserDetails 어노테이션을 사용해 인증된 상태를 시뮬레이션하려고 했습니다. 처음에는 예상보다 많은 오류가 발생해서 이 문제들을 해결하기 위해 어떻게 접근했는지 기록해 보려고 합니다. 😅 [Spring] 로그인 필요한 API 단위 테스트 - 컴도리돌이작심삼주 오블완 챌린지오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.www.tistory.com이제는 숨을 쉬듯이 API 요청 로직을 만들지만, 단 한 번도 테스트 코드로 API 요청을 테comdolidol-i.t..
더보기
-
[Spring] 로그인 필요한 API 단위 테스트 - 컴도리돌이
작심삼주 오블완 챌린지오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.www.tistory.com이제는 숨을 쉬듯이 API 요청 로직을 만들지만, 단 한 번도 테스트 코드로 API 요청을 테스트해 본 적이 없었던 것 같아요. 초반에는 단위 테스트 작성이 시간이 오래 걸리고, 주요 로직보다 더 많은 작업이 될 것 같아서 외면했었죠. 🥲 그런데 로직을 수정할 때마다 프로젝트를 재가동시키며 테스트를 하니 오히려 더 많은 시간이 소요되는 것을 느꼈습니다. 뿐만 아니라 예기치 못한 문제들이 발생하거나, 기존 기능에 새로운 기능을 추가하면서 어떤 영향을 미칠지 파악하기 어려워졌습니다. 이 경험을 통해 이제 단위 테스트는 선택이 아닌 필수라는 생각이 들었습니다. 그래서 이제부터 API 요..
더보기
-
[Elasticsearch] 성능 향상을 위한 doc_values 사용법: 메모리 효율 향상시키기 - 컴도리돌이
작심삼주 오블완 챌린지오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.www.tistory.comElasticsearch에서 성능을 최적화하는 것은 데이터 양이 많을수록 더욱 중요합니다. 보통 검색 속도에 집중하게 되지만, 메모리 사용 최적화 역시 시스템 성능에 큰 영향을 미쳐요. 이때 doc_values라는 기능이 등장하죠! 이 기능을 통해 메모리 사용을 절감하면서도 빠른 응답 속도를 확보할 수 있습니다. 😊근데 doc_values가 뭔데? 🤔doc_values는 필드 데이터를 메모리가 아닌 디스크에 저장하여 필요한 순간에만 참조할 수 있게 해주는 Elasticsearch의 기능입니다. 메모리 대신 디스크를 활용해 대량의 데이터를 효율적으로 다루게 하죠. 이를 통해 JVM 힙 ..
더보기
-
[Elasticsearch] 성능 개선을 위한 코드 비교 및 분석 - 컴도리돌이
작심삼주 오블완 챌린지오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.www.tistory.comElasticsearch로 데이터 검색 속도를 높이는 일은 단순히 쿼리 작성만의 문제가 아니었어요. 때로는 작은 설정 하나하나 코드 스타일이 성능 차이를 만들기도 합니다.불필요한 필드 설정 피하기먼저, 많은 분들이 텍스트 데이터를 다룰 때 대부분의 필드를 text로 지정하는 실수를 합니다. 🤔 텍스트 필드가 많으면 리소스를 불필요하게 잡아먹습니다. 아래처럼 너무 많은 필드를 text로 설정하면 검색 속도가 느려질 수밖에 없어요. // 잘못된 인덱스 설정 예시 { "mappings": { "properties": { "title": { "type": "text" }, "content":..
더보기
-
[Elasticsearch] wildcard 쿼리에 대해 제대로 이해하기 - 컴도리돌이
RDBMS를 사용하다가 Elasticsearch에서 쿼리를 작성하면서 wildcard를 사용한 쿼리의 결과가 제가 생각했던 것과 달라서, 해당 내용에 대해 충분히 이해하기 위해 글을 작성하려고 합니다. Wildcard query를 작성하면서 예상했던 결과는 RDBMS의 LIKE에서 사용했던 '%searchInput%'와 같은 형태가 가능할 것으로 기대했는데, 막상 확인되는 결과는 그렇지 않았습니다. 원본 텍스트는 "경기도 용인시 기흥구 중동 1100번지"와 같은 형태의 주소입니다. 제가 시도한 쿼리는 다음과 같았습니다.{ "query": { "bool": { "must": [ { "wildcard": { "address": { "value": "*경기도 기흥구*" } } } ] } } } 그런데 결과는 ..
더보기
-
[AWS] AWS 보안 그룹 설정과 원본(Source) 개념- 컴도리돌이
이번에 Elasticsearch를 새로 도입하면서, 브랜치를 만들어서 작업물을 푸시하고, 서브도메인을 따서 테스트하려고 했습니다. 톰캣 설치, 젠킨스 설치, 아파치 웹 서버 설정, 서브도메인 연결… 여기까지는 다 문제없었죠. 빌드도 성공하고, WAR 파일 생성도 확인했으며, 서브도메인 접속도 잘 되더군요. 완벽하다 싶었는데… Elasticsearch 서버와의 통신이 안 되는 겁니다! 분명 방화벽 문제 같았고, 보안 그룹의 인바운드 규칙도 제대로 설정한 것 같은데, 원인을 한참 찾느라 헤매다 결국 팀장님이 도와주셨죠. 😅 알고 보니… 문제는 제가 보안 그룹 설정의 "원본 (source)" 개념을 잘못 이해한 거였어요. 그래서 여러분도 저와 같은 멍청한 짓을 피할 수 있도록 간단히 정리해 보았습니다. [..
더보기
-
[Spring] @Cacheable에서 발생하는 self-invocation 문제 - 컴도리돌이
@Cacheable self-invocation (in effect, a method within the target object calling another method of the target object). The cache annotation will be ignored at runtime @Cacheable 어노테이션을 사용해서 메서드 결과를 캐싱하려고 할 때, 같은 클래스 내의 다른 메서드를 호출하면 캐싱이 적용되지 않는 문제가 발생합니다. 저 역시 처음 이 문제를 겪고는 “왜 캐싱이 안 되지?”라는 의문을 가졌어요. 🤔 예를 들어, 아래처럼 getList 메서드에서 getTypeAList 메서드를 호출할 때 @Cacheable을 설정했는데도 캐시가 적용되지 않더라고요public SiteL..
더보기
-
[Spring] @Caching을 활용한 유연한 캐시 관리 - 컴도리돌이
로직은 같지만 타입에 따라 캐싱 처리를 다르게 해야 할 때, 여러분은 어떻게 처리하시나요? 저의 경우, 메서드를 두 개 만들어 타입에 따라 명칭을 달리하고 각각 @Cacheable 어노테이션을 붙여서 사용했습니다. 이게 얼마나 레거시 중에 레거시인지 모르겠네요😂. 이번에 해당 영역을 다시 작업할 일이 생겨 이참에 두 메서드를 하나로 통합해 보려고 하다가, @Caching 어노테이션에 대해 알게 되었습니다. 제 상황에 딱 맞는 적절한 어노테이션이라 생각해서 바로 사용해 보았습니다.🙂 캐시 관리의 중요성이 커지면서, Spring 프레임워크의 @Caching 어노테이션은 복잡한 비즈니스 로직을 효과적으로 처리할 수 있는 강력한 도구입니다. 이번 블로그에서는 @Caching을 통해 다양한 조건에 따라 캐시를..
더보기
-
[Spring] Elasticsearch에서 Query String을 활용해서 검색하기 (feat. Java) - 컴도리돌이
Elasticsearch에서 query_string은 사용자가 입력한 문자열을 기반으로 쿼리를 생성하는 아주 강력한 기능입니다. 이 방식은 복잡한 검색 조건을 간단하게 표현할 수 있도록 도와줍니다. 예를 들어, 사용자가 "apple"을 입력하면 "apple"과 관련된 모든 문서를 찾을 수 있는 거죠. 그렇다면 multi_match나 match와 같은 다른 쿼리와 비교했을 때, 왜 굳이 query_string을 사용해야 할까요? 🤔 우선, query_string은 검색어에 여러 조건을 한 번에 적용할 수 있는 유연함이 있어요. 사용자가 "apple AND banana OR orange"와 같은 복잡한 쿼리를 입력하면, 이를 해석해 다양한 조건을 적용할 수 있답니다. 반면, match나 multi_matc..
더보기
-
[Spring] Elasticsearch에서 스크립팅 언어로 조건 필터링 구현하기(feat. Java) - 컴도리돌이
Elasticsearch에서 데이터 조회 시 특정 조건에 따라 필드 값을 조정하고, 오늘 날짜와 비교해 필터링하는 작업은 종종 필요한 기능입니다. 단순한 필터링 쿼리만으로는 표현하기 어렵거나 우아하지 못한 경우가 많은데요, 저 역시 필드 값의 유효성을 확인하고 이를 기준으로 조건을 처리하면서 우아하지 않은 쿼리식 때문에 고생했죠. 😅그러다 마침내 스크립팅 언어인 Painless를 사용해 원하는 조건을 충족할 수 있었습니다. 이번 포스팅에서는 스크립트 사용법과 함께 이러한 과정을 공유해 보겠습니다.Painless 스크립트 예제Elasticsearch에서 다양한 스크립트 옵션을 사용하는 예제를 살펴보겠습니다. inline, params, lang과 같은 다양한 옵션을 포함해 작성한 예제입니다. 특히, Pa..
더보기
-
[Spring] Elasticsearch에서의 MultiMatch: 다중 필드에 대한 매칭(feat. Java)- 컴도리돌이
ElasticSearch를 도입하고 데이터를 query DSL 방식으로 조회하는 데 도전하면서, 가장 많이 고민하게 되는 부분 중 하나가 바로 정확한 검색 결과를 어떻게 뽑아낼 것인가라는 문제였어요. 그중에서도 multiMatch는 여러 필드에서 검색어를 한 번에 매칭하게 도와주는 아주 유용한 쿼리랍니다. 이번 포스팅 글에서는 multiMatch 쿼리의 다양한 옵션을 소개하고, Java 코드로 구현하는 법까지 쭉 살펴보려고 합니다. 😊Java 코드로 MultiMatch 구현하기multiMatch 쿼리는 여러 필드를 한꺼번에 검색할 때 사용되는 쿼리입니다. 이를 통해 지정한 필드 중 하나라도 매칭되는 문서를 찾아낼 수 있어, 간편하면서도 다채로운 검색 결과를 얻을 수 있어요.import org.elast..
더보기
-
[Spring] Elasticsearch에서 다중 정렬하기 (feat. java, query DSL) - 컴도리돌이
Elasticsearch를 도입하면서 기존에 사용했던 데이터 조회를 Elasticsearch Query DSL 방식으로 변경하고자 하니, 생각 외로 어려움이 많았습니다. 🙄 그중에서 알고 나서는 쉽지만, 처음에는 어떻게 하는지 막막했던 정렬 부분을 다뤄보려고 해요. 😊Elasticsearch Query DSL을 통한 다중 정렬일단 Query DSL에서 sort 배열을 사용하여 여러 필드를 지정하여 정렬할 수 있어요. 아래는 기본적인 예시입니다.{ "query": { "match_all": {} }, "sort": [ { "field1.keyword": { "order": "asc" } }, { "field2": { "order": "desc" } } ]} 위 예제에서 field..
더보기
-
[Spring] docker, Elasticsearch, SpringBoot로 검색 기능 구현 - 컴도리돌이
[Docker] 도커로 ELK8버전 사용하기 - 컴도리돌이이번에 회사에서 ELK를 도입을 본격적으로 시작하였습니다. 🥺 하지만 올해 초부터 책도 선물 받고 잠깐 열심히 공부했지만, 역시 저란 인간은,, 나태 그 자체였습니다. 그래서 뭐 좀 알고 사용comdolidol-i.tistory.com 저번 포스팅에서 도커(dcoker)를 통해 ELK를 실행시켰습니다. 이번에는 스프링부트에서 Elasticsearch로 간단한 검색 API를 구현하려고 해요. 먼저 Spring Boot에서 Elasticsearch와 통신하기 위해 필요한 의존성을 추가해야 합니다. spring-data-elasticsearch 라이브러리를 사용하여 Elasticesearch와 연동할 수 있어요 😊dependencies { im..
더보기
-
[Docker] 도커로 ELK8버전 사용하기 - 컴도리돌이
이번에 회사에서 ELK를 도입을 본격적으로 시작하였습니다. 🥺 하지만 올해 초부터 책도 선물 받고 잠깐 열심히 공부했지만, 역시 저란 인간은,, 나태 그 자체였습니다. 그래서 뭐 좀 알고 사용해야 하기 때문에 일단 ELK를 설치하려고 하는데 생각보다 쉽지 않았습니다... ChatGpt는 저를 과대평가하는지 너무 두리뭉실하게 설명해 주는데 저란 인간은 그 문장 하나하나가 너무 힘들었어요. 😓 그래서 후딱후딱 설치하고 실행시켜서 제 프로젝트에 어떻게든 사용법을 터득하려고 합니다. 일단은 저는 도커에서 elk 8 버전을 사용하려고 합니다. elastic.co에서 Elasticsearch랑 kibana, logstash를 설치해서 사용해도 되지만, 계속할 때마다 에러가 발생해서 저는 다음 git에서 조금 더 쉽..
더보기
-
[이펙티브 자바][아이템 9] try-finally 보다 try-with-resources 를 사용하라 - 컴도리돌이
많은 개발자들이 자주 사용하는 try-finally 블록은 리소스를 명시적으로 해제해야 하는 경우에 자주 사용됐지만, 이 방법에는 몇 가지 단점이 있어요. 코드가 장황해지고, 가독성이 떨어지며, 예외가 발생할 경우 자칫 리소스 해제가 제대로 이루어지지 않을 가능성이 생기죠. 특히 스프링 부트 환경에서 여러 외부 리소스나 파일, 데이터베이스 연결 등을 다룰 때 더욱 신중하게 할 필요가 있습니다. 🧐 이런 문제를 해결하기 위해 등장한 것이 try-with-resources인데, 이 구조는 자바 7에서 도입되었고, 자동으로 리소스를 해제해 주는 것이 특징이에요. 리소스를 명시적으로 닫지 않아도 되기 때문에 코드가 훨씬 간결해지고, 예외가 발생하더라도 안정하게 리소스를 관리할 수 있죠. Connection ..
더보기
-
[이펙티브 자바][아이템 8] finalizer와 cleaner 사용을 피하라 - 컴도리돌이
이번 주제는 저에게는 매우 생소한 주제였어요 😓finalizer와 cleaner 같은 개념이 매우 생소하였거든요, 저는 보통 try-with-resources 구문과 @PreDestroy 어노테이션을 사용해서 자바에서 객체가 더 이상 필요하지 않을 때 리소스를 정리하곤 했는데, 객체 생성 자체를 워낙 많이 하지 않는 편이어서 더욱 생소했던 거 같네요. 그래도 열심히 책을 읽었기에, 오늘 이 주제로 글을 남기려고 합니다. 😤 과거에는 자바에서 객체가 더 이상 필요하지 않을 때 리소스를 정기하기 위해 finalizer를 사용했습니다. 하지만 finalizer는 다음과 같은 문제가 있었죠.첫 번째는 finalizer는 언제 실행될지 예측할 수 없다고 합니다. 이거 매우 위험하지 않나요? 실행 시점이 정확히..
더보기
-
[PostgreSQL] 텍스트 검색 최적화: phraseto_tsquery - 컴도리돌이
이번에 검색 기능을 최적화해야 하는 쿼리가 있었습니다. 검색 시스템의 성능은 사용자 경험에 크게 영향을 미치기 때문에, 빠르게 정확한 검색 결과를 제공하는 것이 매우 중요하죠. 처음에 유저가 검색한 데이터를 보여주기 위해서, PostgreSQL의 LIKE 연산자를 사용하여 텍스트 검색을 처리하곤 했습니다. 그러나 데이터가 많이 지면서 검색 성능이 눈에 띄게 저하되는 상황이 많이 놓였죠 😓특히, 다중 단어 검색에서는 문제점이 더욱 두드러집니다. 예를 들어, "postgresql performance tuning"과 같은 문구를 검색할 때, LIKE 쿼리는 부분 단어 매칭에만 의존해 결과가 너무 광범위하거나 불안전했습니다. 성능도 상당히 떨어지고요. 🤨 그래서 이번에는 단순한 키워드 검색이 아닌, 문장..
더보기
-
[이펙티브 자바][아이템 7] 다 쓴 객체 참조를 해제해라 - 컴도리돌이
자바 프로그래밍을 하다 보면 한 번쯤은 "메모리 누수"라는 문제를 들어본 적이 있을 거예요. 그렇다면 메모리 누수가 실제로 어떻게 발생할까요? 자바는 가비지 컬렉터(Garbage Collector, GC)를 통해 사용하지 않는 객체를 자동으로 수거하는데, 그렇다면 왜 우리는 여전히 메모리 누수를 걱정해야 할까요?? 🤔 가비지 컬렉터가 잘못된 객체를 수거하지 못하게 만드는 주된 이유 중 하나는 바로 다 쓴 객체에 대한 참조를 해제하지 않기 때문이에요. 이 문제는 특히 메모리를 장시간 사용하거나, 많은 객체를 다루는 애플리케이션에서 더 심각하게 드러난다고 합니다. 가령, 우리가 다 쓴 객체를 필요 이상으로 참조하고 있는 경우, 해당 객체는 가비지 컬렉터의 대상이 되지 않으며, 그 결과 메모리가 불필요하게 ..
더보기
-
[Spring] 순환 의존성(Circular Dependency)에 대하여 - 컴도리 돌이
두 개 이상의 빈이 서로를 참조할 때 발생하는 문제로, 스프링 프레임워크에서는 애플리케이션 컨텍스트가 빈을 초기화할 때 문제가 발생합니다. 간단히 말해, 빈 A가 빈 B를 필요로 하고, 빈 B가 다시 빈 A를 필요로 하는 상황을 말해요. 이로 인해 애플리케이션이 제대로 시작되지 않거나 예기치 못한 런타임 오류가 발생할 수 있어요. 순환 의존성 문제가 발생할 때 보통 다음과 같은 에러 로그를 볼 수 있어요 🤔org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanA': Requested bean is currently in creation: Is there an unresolvable circu..
더보기
-
[Spring] AOP(Aspect-Oriented Programming)에 대해서 - 컴도리돌이
개발을 하면서 "이 부분은 코드가 반복되는데, 더 좋은 방법이 없을까"라는 생각을 정말 매 순간 하는 거 같아요. 🥲 그중 하나의 해결 책으로 AOP가 그 해답이 될 수 있어요 🤔AOP(Aspect-Oriented Programming)AOP는 프로그램의 특정 동작을 관심사라는 개념으로 분리해서 관리하는 기법이에요. 이게 무슨 말이냐면, 코드에서 여러 곳에서 반복되는 공통된 로직을 한 곳에 모아둔 후, 필요할 때마다 그 로직을 실행하게 할 수 있다는 거예요. 이렇게 하면 코드의 중복을 줄이고, 유지 보수가 훨씬 쉬워지죠 👍 예를 들어, 로깅이나 트랜잭션 관리와 같은 로직은 다양한 메서드에서 공통적으로 사용돼요. 만약 이런 로직을 각 메서드에 직접 작성한다면 코드가 지저분해질 뿐 아니라, 유지보수도 어려워..
더보기
-
[Spring] 제어의 역전(IoC, Inversion of Control), 의존성 주입(DI, Dependency Injection)에 대하
Spring의 Ioc/DI은 Spring을 사용하면서 자연스럽게 접하게 되는 개념들이지만, 때로는 그 깊은 의미를 되새겨볼 필요가 있습니다. 이 두 가지 개념이야말로 Spring의 근본을 이루는 핵심정인 원리이기 때문이죠. 저 또한 2022년에 작성한 글을 전부 삭제하고, 새로운 마음으로 2024년에 new 포스팅 글을 작성하려고 해요.😊 Ioc, 즉 제어의 역전(Inversion of Control)과 DI, 의존성 주입(Dependency Injection)은 코드의 결합도를 낮추고, 더 유연하고 테스트 가능한 애플리케이션을 만드는 데 필수적인 역할을 해요. 여기서 궁금한 점은 왜 Spinrg은 굳이 IoC와 DI를 통해 객체 관리를 하도록 했을까요? 🤔 그 이유는 간단하면서도 깊이가 있습니다. 소프..
더보기
-
[이팩티브 자바][아이템 6] 불필요한 객체 생성을 피하라 - 컴도리돌이
자바를 사용하면서 이 객체를 매번 새로 만들어야 할까?라는 상황이 수 없이 오게 됩니다. 저 또한 이런 물음을 스스로에게 던져본 적이 매우 많았죠.. 이펙티브 자바에서 강조하는 불필요한 객체 생성을 피하라 는 원칙이 바로 저 물음에서 시작돼요. 그렇다면 왜 불필요한 객체 생성을 피하는 것이 중요할까요? 🙄 자바에서 객체를 생성하는 건 매우 흔한 일이죠. new 키워드로 쉽게 객체를 만들 수 있으니, 별 다른 고민 없이 계속해서 객체를 생성할 수 있죠. 하지만 반복적인 객체 생성이 메모리와 성능에 어떤 영향을 미칠까요? 🤔객체를 생성하는 과정은 메모리 할당, 초기화, 그리고 생성자 호출 등의 작업을 수반해요. 이러한 작업들이 단일 객체에 대해서는 큰 문제가 되지 않을 수 있지만, 동일한 객체를 반적으로..
더보기
-
[PostgreSQL] 제약조건 설정시 주의해야할 부분을 고려하면서(PRIMARY KEY, NOT NULL, UNIQUE, CHECK) - 컴도리돌이
이전 포스팅에서 제약조건을 간단하게 설정하는 방법과 제약조건을 설정할 때 어느 부분을 고려해야 할지 짧게 확인해 보았어요. 이번에는 조금 더 세부적으로 설정하는 방법과 언제 사용하는지에 대해 스터디를 해보려고 해요. [PostgreSQL] 제약조건에 대해서(PRIMARY KEY, UNIQUE, NOT NULL, CHECK) - 컴도리돌이PostgreSQL에서 제약조건에 대해 글을 남겨보려고 해요. 제약조건은 데이터베이스에서 우리가 입력하는 데이터가 올바르고 일관되도록 도와주는 규칙이라 생각하면 돼요. 예를 들어, 고객의 이메comdolidol-i.tistory.com 적절하게 제약조건을 걸자!제약조건을 설정할 때 적재적소하게 사용하는 게 중요하다고 했죠? 모든 필드에 제약조건을 걸고 싶은 유혹이 있을..
더보기
-
[PostgreSQL] 제약조건에 대해서(PRIMARY KEY, UNIQUE, NOT NULL, CHECK) - 컴도리돌이
PostgreSQL에서 제약조건에 대해 글을 남겨보려고 해요. 제약조건은 데이터베이스에서 우리가 입력하는 데이터가 올바르고 일관되도록 도와주는 규칙이라 생각하면 돼요. 예를 들어, 고객의 이메일 주소가 잘못 입력되었을 때 이를 방지할 방법이 없다고 하면 큰일이겠죠? 그래서 제약조건에 대해 아는 것은 매우 중요해요. 그럼 예시 코드를 보면서 자세히 알아보겠습니다 😆CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INT CHECK (age >= 0)); 이 예시에는 users라는 테이블을 생성하였는데, 여기서 주목할 부분은 PRI..
더보기
-
[PostgreSQL] 해시 인덱스(Hash Index)에 대해서 - 컴도리돌이
쿼리를 작성하고 나서 실행 계획을 확인하다 보면 가끔 Bitmap Index Scan이나 Hash Join이라는 용어를 접하게 돼요. 해시 인덱스가 사용된 걸 보고는 이제 데이터 조회가 더 빠르겠지?라고 기대했는데, 의외로 성능이 좋지 않을 때가 많더라고요 🤔 그럴 때마다 해시 인덱스를 사용되었는데, 왜 이렇게 느리지?라는 생각만 들곤 했지만, 한 번도 검색해보지 않는 과거의 저를 반성하며 오늘의 나는 해시 인덱스에 대해 깊이 알아가는 시간을 가지려고 해요 😊 해시 인덱스는 PostgreSQL에서 효율적인 데이터 검색을 위해 제공하는 여러 인덱스 유형 중 하나이에요. 이 인덱스는 특정한 키 값에 대해 매우 빠른 조회 성능을 제공하는데, 그 이유는 해시 함수를 사용하여 데이터를 처리하기 때문이죠. 여기..
더보기
-
[Design Pattern] 옵저버 패턴(Observer Pattern)에 대해서 - 컴도리돌이
어떤 애플리케이션이든 데이터를 관리하는 객체가 있고, 그 데이터를 사용하는 다른 객체들이 있습니다. 데이터를 가진 객체가 상태를 변경했을 때, 그와 연결된 다른 객체들도 그 변화를 알아야 한다면, 어떻게 이 문제를 해결할 수 있을까요? 🤔초기에는 데이터 객체가 모든 연결된 객체들을 직접 참조하면서 상태 변경을 통보하는 방식이 사용되었을지도 모릅니다. 하지만 이렇게 하면 문제가 생겨요. 🤨 객체 간의 의존성이 강해져, 하나의 변경이 시스템 전체에 영향을 미치게 되고, 코드가 복잡해지며 유지보수가 어려워지죠. 그래서 옵저버 패턴이 등장하게 돼요. 옵저버 패턴은 한 객체의 상태 변화가 있을 때, 그와 관련된 다른 객체들에게 자동으로 알려주는 구조를 제공해 줘요. 객체들은 서로 느슨하게 결합되어 있고, 이..
더보기
-
[이펙티브 자바][아이템 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 - 컴도리돌이
자원을 직접 생성하거나 관리하는 방식은 코드의 유연성과 유지보수성을 크게 제한할 수 있습니다. 자원을 직접 관리하고 명시하는 방식이 실제로는 많은 문제를 초래할 수 있다고 합니다. 왜 그럴까요? 🤔 자원을 직접 명시하는 경우, 예를 들어 파일 읽기와 같은 작업을 수행하는 유틸리티 클래스를 작성한다고 가정해 볼게요.파일을 읽기 위해 BufferedReader를 직접 생성하는 클래스 FileReaderUtil을 만들었다고 생각해 보면, 클래스 내부에서 직접 BufferedReader를 생성하고 관리하는 코드가 들어가죠. 이렇게 되면, 이 클래스는 파일 시스템과 강하게 결합되게 됩니다. 즉, 파일 경로와 파일을 여는 방식이 하드코딩되어 있어, 만약 파일 경로를 바꾸거나 다른 파일 시스템 접근 방식을 사용해야..
더보기
-
[이펙티브 자바][아이템 4] 인스턴스화를 막으려거든 private 생성자를 사용하라 - 컴도리돌이
클래스를 만들 때 모든 메서드가 인스턴스화되어야 할까요? 🤔때때로 우리는 클래스의 인스턴스가 만들어지는 것을 막아야 할 필요가 있어요. 예를 들어, 유틸리티 클래스를 만들거나, 특정 메서드나 상수를 집합적으로 관리하고 싶을 때, 불필요한 인스턴스를 방지하는 것이 중요할 수 있습니다. 그럼 어떻게 해야 할까요? 자바에서는 인스턴스화를 막는 가장 쉬운 방법 중 하나는 private 생성자를 사용하는 것입니다. 이것은 클래스의 인스턴스가 외부에서 생성되지 않도록 보장을 하기 때문이죠. 쉽게 생각하면, 비밀번호로 잠긴 문이 있다고 가정하면, 비밀번호를 모르면 문을 열 수 없듯이, private 생성자를 사용하면 외부에서 인스턴스를 생성할 수 없게 됩니다. 자주 사용하는 유틸리티 메서드를 모아둔 클래스를 만들..
더보기
-
[이펙티브 자바][아이템 3] private 생성자나 열거타입으로 싱글턴임을 보증하라 - 컴도리돌이
싱글턴 패턴은 일반적으로 자원의 효율적인 사용과 프로그램의 일관성을 유지하기 위해 사용돼요. 예를 들어, 애플리케이션에서 로깅, 캐시, 설정 정보와 같은 클래스는 인스턴스가 여러 개일 필요가 있을까요?? 당연히 없겠죠? 만약 이런 클래스의 인스턴스가 여러 개라면 상태가 서로 달라질 수 있고, 이는 예기치 않은 버그를 유발할 수 있어요 😔그렇기 때문에 이런 클래스를 싱글톤으로 구현하여, 프로그램 내에서 단 하나의 인스턴스만 존재하도록 하는 것이 중요합니다. 🛠️ private 생성자와 싱글톤 보증자바에서는 싱글톤 패턴을 구현할 때 가장 많이 사용되는 방법 중 하나는 private 생성자를 활용하는 것입니다. 이 방식은 클래스의 인스턴스를 외부에서 생성할 수 없도로 막아줘요.public class Sin..
더보기
-
[이펙티브 자바][아이템 2] 생성자에 매개변수가 많을 때는 빌더를 고려하라 - 컴도리돌이
개발을 하다 보면 객체를 생성해야 할 때가 당연히 있습니다. 그런데 그 객체를 생성하기 위해 생성자를 사용했는데, 매개변수가 한두 개가 아니라 다섯 개, 여섯 개, 열 개가 넘어갈 때가 있지 않나요? 🤔 예를 들어 영양 정보를 담는 NutritionFacts 클래스를 가지고 가정해 볼까요? public class NutritionFacts { private final int servingSize; // 필수 private final int servings; // 필수 private final int calories; // 선택 private final int fat; // 선택 private final int sodium; // 선..
더보기
-
[Design Pattern] 브릿지 패턴(Bridge Pattern)에 대해서 - 컴도리돌이
class Circle { void drawWithRedColor() { // 빨간색 원 그리기 } void drawWithBlueColor() { // 파란색 원 그리기 }}class Square { void drawWithRedColor() { // 빨간색 사각형 그리기 } void drawWithBlueColor() { // 파란색 사각형 그리기 }} 이 코드에서 Circle과 Square 클래스는 각각 빨간색과 파란색으로 도형을 그리는 메서드를 가지고 있어요. 지금은 두 가지 도형과 색상만 다루고 있죠.그런데 여기서 도형의 종류가 더 늘어나면 어떻게 될까요? 또는 색상이나 그리기 방식이 더 다양해지면 어떨..
더보기
-
[이펙티브 자바][아이템 1] 생성자 대신 정적 팩토리를 고려해라 - 컴도리돌이
자바에서 객체를 생성하는 전통적인 방법은 'new' 키워드를 사용하는 생성자 호출이에요. 그러나 이번 주제에서는 생성자 대신 정적 팩토리 메서드(static factory methods)를 고려할 것을 권장하는 것을 다뤄보려고 합니다. 1. 명명된 생성자를 통한 가독성 향상자바에서 객체를 생성할 때, 일반적으로 사용하는 방법은 'new' 키워드를 사용하여 생성자를 호출합니다. 근데 이런 방식은 추후에 다른 개발자가 해당 코드를 사용할 때, 조금 많이 힘든 경우가 있어요 🥲 생성자는 클래스 이름과 동일해야 하며, 여러 인자를 받는 경우에도 생성자 자체에 이름을 지정할 수 없죠. 이로 인해 생성자의 목적이나 인자들이 무엇을 의미하는지 명확하지 않을 수 있어요. public class User { ..
더보기
-
[Design Pattern] 플라이웨이트 패턴(Flyweight Pattern)에 대해서 - 컴도리돌이
다수의 유사한 객체를 생성하면 메모리 사용량이 급격히 증가할 수 있어요. 😓이러한 문제를 해결하기 위해 플라이 웨이트 패턴은 동일한 객체를 공유하여 메모리 낭비를 줄이고 성능을 향상하는 방법을 제시해 줍니다. 예를 들어, 수천 개의 동일한 글꼴을 사용하는 텍스트 객체가 있다고 가정해 볼게요. 이러한 텍스트 객체는 동일한 스타일과 크기를 공유하지만, 위치나 색상과 같은 상태만 다르죠. 각 테스트 객체가 개별적으로 메모리를 차지한다면 비효율적일 수 있어요. 플라이웨이트 패턴은 이러한 공통된 속성을 공유하여 메모리 사용을 최소화합니다. class Flyweight { private final String sharedState; public Flyweight(String sharedState) { ..
더보기
-
[Design Pattern] 싱글톤 패턴(Singleton Pattern)에 대해서 - 컴도리돌이
싱글톤 패턴은 하나의 클래스에 대해 단 하나의 인스턴스만 생성하고, 이를 전역적으로 접근할 수 있도록 하는 디자인 패턴이에요. 싱글톤 패턴을 구현하는 방법은 여러 가지가 있지만, 가장 쉬운 방법부터 확인해 볼까요? 싱글톤 패턴(Singleton Pattern)다음은 자바에서 기본적인 싱글톤 패턴 구현 방법입니다. public class Singleton { // static 변수로 인스턴스 선언 private static Singleton instance; // private 생성자, 외부에서 직접 인스턴스를 생성할 수 없음 private Singleton() {} // public static 메서드로 인스턴스에 접근 public static Singleton getIn..
더보기
-
[Apache] 아파치에서 가상호스팅 설정하는 방법 - 컴도리돌이
여러 개의 도메인이 같은 IP 주소를 공유하고, 각 도메인이 특정 포트로 연결되도록 설정하려는 경우가 존재합니다. 이는 아파치 웹 서버에서 가상 호스팅(Virtual Hosting)을 사용하여 구현할 수 있으며, 이번 포스팅에서는 가상 호스팅에 짧은 개념과 설정 방법에 대해 적어 나가려고 합니다. 가상호스팅 (Virtual Hosting)가상 호스팅은 하나의 웹 서버에서 여러 도메인을 호스팅 할 수 있게 해주는 방법으로 두 가지 주요 방식이 존재합니다. 첫 번째는 이름 기반 가상호스팅이고, 두 번째는 IP 기반 가상 호스팅입니다. 이번 포스팅에서는 하나의 IP 주소에서 여러 도메인을 포트별로 구분하여 호스팅 하는 방법을 설명합니다. 이를 포트 기반 가상 호스팅이라고 할 수 있습니다. 아파치 설정 파일 수..
더보기
-
[AWS][Route 53] DNS 레코드에 대해서 - 컴도리돌이
새로운 프로젝트에 대한 개발 인프라를 구축해야 하는 일이 생겼습니다. 🤔🤔인프라 작업 계획서를 작성하고 컨펌받으면서 모르는 부분이 너무 많아서, 이번 기회에 해당 내용들을 차근차근 정리하려고 해요. 😊사실 레코드 만드는 건 어렵지 않아요. 서브도메인 이름 알맞게 넣고, 기본 유형에 인스턴스 ip, 그리고 기존에 존재하는 다른 레코드의 ttl를 따라 하거나, 적정한 값에서 조절하면 되고 라우팅 정책도 다른 레코드와 유사하게 아니면 기본적인 값을 집어넣으면 돼요. 😎 짜잔 10초 만에 레코드를 생성할 수 있답니다. 😆😆 하지만 저는 각 항목에 대한 이해가 부족하기 때문에 이번 포스팅에서는 각각 어떤 의미를 갖고, 어떤 역할을 하는지 포스팅하려고 해요. AWS Route 53에서 레코드를 생성할..
더보기
-
[Kafka][ERROR] Classpath is empty. Please build the project first e.g. by running './gradlew jar -PscalaVersion=2.13.12' - 컴도리돌이
이번에 업무로, 메인 프로젝트에서 사용했던 API 호출 기능을 consumer 프로젝트로 이전시키는 일을 맡게 되었어요. 하지만 나는 카프카를 사용해 본 적이 없죠! 😎 길을 개척한 팀장님의 코드를 보면서, 정상 작동하게끔 개발을 하는 것은 어렵지는 않지만,,, 🙄🙄그래도 직접 로컬에서 카프카를 설치하여, 프로젝트랑 연동해서 테스트를 해봐야 개발자 아니겠습니까 🤔 하지만 카프카를 실행시키는 것 조차도 순탄하지 않네요 🥲 시작한 지 10분 만에 맞닥뜨린 오류는 다음과 같아요.. Classpath is empty. Please build the project first e.g. by running './gradlew jar -PscalaVersion=2.13.12' 이미 저와 같은 동지 개발자분..
더보기
-
[Design Pattern] 빌더 패턴(Builder Pattern)에 대해서, @Builder - 컴도리돌이
객체를 생성할 때, 보통 다음과 같이 코드를 작성할 것입니다. public void builderPattern() { Car car = new Car(); ...} 하지만 객체를 생성할 때는, 빈 깡통으로 사용하기보다는 그 객체의 고유한 값을 갖은 상태로 객체를 사용할 것입니다. 그렇기 때문에 객체를 생성할 때는 파라메터를 전달하여 생성해야겠죠. 생성할 때 필요한 매개변수를 입력하여 다음과 같이 코드를 작성합니다. public void builderPattern() { String param1 = "Chevrolet"; String param2 = "RS"; int param3 = 2024; ... Car car = new Car(param1, pa..
더보기
-
[JAVA 21] 자바의 미래, 가상 스레드(Virtual Thread)에 대해서 - 컴도리돌이
전통적인 자바 스레드 서버 애플리케이션에서 동시성 처리를 위해 스레드를 사용하는 것은 오랜 전통이었습니다. 예를 들어 스프링 프레임워크는 여러 요청을 처리하기 위해 멀티 스레드 모델을 채택한 프레임 워크입니다. 보통은 각 요청을 처리하는 데 하나의 스레드를 할당하는 방식으로 작동됩니다. 그러나 이 방식은 요청이 많아질수록 문제가 발생하게 됩니다. 과거에는 운영 체제 스레드의 제약으로 인해 동시 요청에 대응하기 위해 스레드 수를 늘리는 것이 어려웠습니다. 이는 스레드가 비용이 높고, 시스템에 사용 가능한 스레드 수가 제한되기 때문이죠. 또한 자바의 스레드는 운영 체제 스레드의 Wrapper로 동작하기 때문에 I/O 작업을 만나면 블로킹되어 다른 작업을 수행할 수 없는 경우가 발생합니다. 예를 들어 스프링..
더보기
-
[Docker] 도커 컨테이너(Docker Container)와 도커 이미지(Docker Image)에 대해서 - 컴도리돌이
[Docker] 도커 엔진(Docker Engine)에 대해서 - 컴도리돌이회사에서 이제 카프카(kafka), 도커(docker), 엘라스티서치(elk), 등을 도입 얘기가 나오는데, 나는 아무것도 모릅니다. 😓 오늘은 도커 엔진에 대해 포스팅을 해볼 생각입니다. 아는 게 많고 해 봤던comdolidol-i.tistory.com Install Docker Desktop on MacInstall Docker for Mac to get started. This guide covers system requirements, where to download, and instructions on how to install and update.docs.docker.com 이전 포스팅에서 도커 엔진이 어떻게 구성되어..
더보기
-
[Docker] 도커 엔진(Docker Engine)에 대해서 - 컴도리돌이
회사에서 이제 카프카(kafka), 도커(docker), 엘라스티서치(elk), 등을 도입 얘기가 나오는데, 나는 아무것도 모릅니다. 😓 오늘은 도커 엔진에 대해 포스팅을 해볼 생각입니다. 아는 게 많고 해 봤던 것이 많은 개발자가 얼른 되고 싶네요 😭😭 도커(Docker)도커는 클라이언트-서버 모델을 구현한 애플리케이션입니다. 도커 엔진은 도커 컴포넌트(Docker Componets)와 서비스를 제공하는 컨테이너를 구축하고 실행하는 기본 핵심 소프트웨어이에요. Docker Demon, Docker Client, Docker image, Docker Container, Docker Registry로 주요 구성되어 있으며, 개발자가 흔히 도커라고 할 때, 주로 Docker Engjine을 의미합니..
더보기
-
[JAVA] HashMap에 대해서(Thread Safe, 해시맵 동작 원리, chaining, 해시 충돌(Hash Collision), Fail-Fast ) - 컴도리돌이
사용자의 요청을 받고, 요청을 전달할 때 저는 대게 다음과 같이 HashMap을 사용합니다😓 @GetMapping("/") public String main(@RequestParam HashMap reqMap) { ... } 물론 위와 같이 사용하는 건 굳이 좋은 방식이 아닙니다. 필요한 값만 정의한 DTO 클래스를 사용하는 것이 일반적으로는 훨씬 더더더 좋죠 😊 하지만 개발하다 보면 필요했던 값이 필요하지 않아 지고, 생각하지 않은 값이 필요하게 되는 상황이 대게 많기 때문에 저는 HashMap을 사용합니다. 😔 (시간이 부족해...) 그런데 이렇게 자주 사용한 HashMap이 사실 어떻게 작용하는지 알지 못합니다. 물론 알지 못해도 지금까지 잘 사용했지만, 그래도 알고 사용하는 것과 무지로 사용하는 ..
더보기
-
[AWS] VPC, Subnet, 보안 그룹에 대해서 - 컴도리돌이
기존 메인 서버에 사용했던 레디스를, 다른 서버에서 관리하는 로직을 개발하려고 했습니다. 당연히 메인 서버에서 설정한 레디스 설정을 그대로 사용하여, 필요한 기능을 구축했습니다. 개발 완료 후에 선임 개발자에게 "메인 서버와 같은 동일한 설정을 하면 과연 작동할까요? 작동하지 않을까요? 각각의 이유를 생각하면 좋겠어요."라는 질문을 받았습니다. 🫥🫥 질문은 오늘 포스팅할 "VPC, subnet 및 보안 그룹에 대한 개념을 갖고 있나요?"라는 의도였고, 저는 당당히 몰랐습니다. 😎 그래서 이번 기회가 아니면, 한 동안 다시는 공부하지 않을 저를 알기에,, 😊 하나부터 열까지 내용을 차근차근 적어 내려가면서 스터디를 할 생각이에요. VPC는 아마존에서 제공하는 가상 네트워크 서비스로, 가상 네트워크에서 리소..
더보기
-
[Spring] Spring Cache Abstraction, @Cacheable, Redis Monitor 에 대해서 - 컴도리돌이
이전 포스팅에서 Redis 설정하는 방법과 그 안에서 사용한 메서드에 대해서 가볍게 포스팅을 해봤습니다. 이번에는 설정한 CacheManager을 통해서 스프링에서 캐싱을 어떻게 사용하는지 알아보려고 해요 😊@Cacheable캐싱은 많은 애플리케이션에서 성능을 향상하는 핵심적인 기술 중 하나이며, 그중에서도 스프링 프레임워크에서는 @Cacheable 어노테이션을 통해 메서드 호출의 결과를 캐싱하는 기능을 제공합니다. 이를 통해 반복적인 계산을 피하고 응답 시간을 줄일 수 있게 됩니다. @Cacheable는 메서드의 특정 인자에 대한 결과 값을 캐시저장소에 저장하고 같은 인자에 대한 결과 값을 메서드를 실행하지 않고 캐싱 저장소에서 가져와 반환을 해줍니다. @Servicepublic class MySer..
더보기
-
[Spring] RedisConfig 설정(CachingConfigurer, CacheManager, RediscacheConfiguration, serialize, RedisCacheManager) - 컴도리돌이
레디스 설정부터, 레디스 조회/ 추가/ 삭제 등에 대한 깊게 다뤄보려고 합니다. 올해 자바 버전 업과 스프링 버전 업을 했기 때문에 다시 레디스 설정에 대해 다시 정비하는 시간을 가지려고 합니다. 겸사겸사 설정한 코드에 대한 깊게 분석할 시간을 가지려고 합니다. 😊 레디스는 메모리 기반의 데이터 저장소로서, 캐싱, 세션 관리 등 다양한 용도로 사용되는데, 저는 스프링 부트를 사용하며 레디스는 대게 캐시 매니저나 세션을 저장을 할 때 활용되고 있어요. 스프링 부트에서는 레디스를 간편하게 설정하고 사용할 수 있는데, properties 또는 yml 파일에서 redis 호스트, 포트, 타입 등을 간단하게 설정할 수 있어요. 저는 properties 파일을 사용하기 때문에 다음과 같이 설정을 했습니다 🙄sp..
더보기
-
[Design Pattern] 퍼사드 패턴(Facade Pattern)에 대해서 - 컴도리돌이
퍼사드 패턴(Facade Pattern)퍼사드(Facade)는 건물의 정면을 의미해요. 건물 내부의 복잡함을 숨기고 건물의 정면만을 나타나게 합니다. 유저들은 건물의 정면에 있는 출입구를 통해 내부를 이용하게 됩니다. 즉, 건물의 정면이 마치 인터페이스가 되는 것이죠.🤔 시스템의 복잡한 부분을 감추고 사용자에게 단순한 인터페이스를 제공하는 개념이에요. 건물의 정면이 마치 출입구가 되어 건물 내부로 들어가는 것처럼, 사용자가 시스템의 내부 동작을 몰라도 간단한 인터페이스를 통해 시스템을 사용할 수 있게 해 줍니다. 온라인 쇼핑몰을 예를 들어 다음 퍼사드 패턴에 대해서 설명해 볼게요 😊 퍼사드 패턴 적용 예시(Facade Pattern Example)사용자는 제품을 검색하고 구매할 수 있지만, 그 내부에서는..
더보기
-
[Design Pattern] 전략 패턴(Strategy Pattern)에 대해서 - 컴도리돌이
여러 방식으로 기능이 작동되는 메서드에서, 또 다른 기능을 추가해야 할 경우 어떻게 해야 할까요? 🤔 코드 형태에 따라 구현 방식이 천지 차이지만, if-else로 분기를 태워서 한 메서드에서 서로 다른 기능을 제공하는 경우가 많이 존재할 겁니다. 간단한 예시로 연산 종류에 따른 다른 동작을 수행시키는 계산기 코드를 다음과 같이 작성해 보았어요. public static int calculate(String operation, int operand1, int operand2) { int result; if (operation.equals("add")) { result = operand1 + operand2; } else if (operation.equals("subtract")) { result = op..
더보기
-
[PostgreSQL] B-tree index에 대해서 - 컴도리돌이
B-treePostgreSQL에서 기본적으로 사용되는 인덱스 구조는 B-tree로 되어 있습니다. B-tree는 데이터베이스에서 빠른 검색 및 정렬된 데이터 액세스를 위해 설계된 효율적인 인덱스 구조입니다. B-tree의 인덱스 행은 페이지로 구성됩니다. 잎 페이지에서는 이러한 행에 데이터를 인덱싱할 키와 테이블 행(TID)에 대한 참조가 포함되며, 내부 페이지에서는 각 행이 인덱스의 자식 페이지를 참조하고 이 페이지의 최소 값을 포함합니다. B-tree의 몇 가지 중요한 특성이 다음과 같이 있습니다. B-tree는 균현이 잡혀 있으며, 각 잎 페이지는 루트로부터 동일한 수의 내부 페이지로 분리됩니다. 따라서 모든 값에 대한 검색은 동일한 시간이 걸립니다.B-tree는 각 페이지(보통 8KB)는 많은(수..
더보기
-
[PostgreSQL] 인덱스 온리 스캔(index only scan)에 대해서 - 컴도리돌이
인덱스 온리 스캔(Index Only Scan) 인덱스 온리 스캔(Index Only Scan)은 인덱스 스캔과 유사하지만, 테이블 데이터 대신 인덱스로부터 직접 데이터를 가져옵니다. 따라서 테이블 데이터에 대한 접근이 필요 없으므로, 더 빠른 쿼리 실행 속도를 제공합니다. 인덱스 온리 스캔을 사용한다는 것은 데이터베이스가 쿼리의 결과를 인덱스만으로 만들어내기 때문에 "인덱스만 스캔한다."라고 표현할 수 있습니다. 테이블 예제 테스트를 위해서 테이블은 다음과 같이 작성했습니다. CREATE TABLE books_test ( books_id INTEGER NOT NULL PRIMARY KEY , books_title VARCHAR , books_price INTEGER , books_link VARCHAR..
더보기
-
[Spring] 롬복 어노테이션(@NoArgsConstructor, @RequiredConstructor, @AllArgsConstruct)에 대해서 - 컴도리돌이
생성자 주입(Constructor Injection)은 의존성 주입의 한 종류로, 객체를 생성할 때 해당 객체가 필요로 하는 의존성을 생성자를 통해 주입하는 방식이에요. 스프링 프레임워크에서는 Autowired 어노테이션을 사용합니다. 반면에 필드 주입(Field Injection)은 의존성을 클래스의 필드에 직접 주입하는 방식이며, Autowired 어노테이션을 필드에 적용합니다. @Servicepublic clas ExampleService { private final ExampleRepository exampleRepository; @Autowired public ExampleService(ExampleRepository exampleRepository) { thi..
더보기
-
[Design Pattern] 데코레이터 패턴(Decorator Pattern)에 대해서 - 컴도리돌이
데코레이터 패턴(Decorator Pattern)은 객체의 기능을 확장하거나 수정할 때 사용되는 디자인 패턴이에요. 유연하게 확장을 할 수 있기에, 정적 또는 동적으로 객체에 새로운 기능을 부여할 수 있어요. 일상생활에서는 선물 포장이 떠오르는데, 선물을 준비할 때 종이나 리본, 스티커 등을 사용해서 선물을 포장합니다. 이렇게 포장을 추가하는 것은 기존 선물을 변경하지 않고도 새로운 요소를 덧붙여 선물을 만드는 것과 유사해요. 데코레이터 패턴도 이와 비슷하게 기존 객체를 그대로 유지하면서 새로운 기능을 추가하거나 변경함으로써 객체를 더욱 강화시킵니다. 이렇게 하면 기본 객체는 변함없이 유지되면서도 새로운 기능을 더해주어 객체의 활용도를 높일 수 있어요. 데코레이터 패턴 구조(Decorator Patter..
더보기
-
[Java] 서블릿 컨테이너(Servlet Container)에 대해서 - 컴도리돌이
A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol. 서블릿과 서블릿 컨테이너(Servlet and Servlet Container) 일반적으로 웹 서버는 정적인 페이지를 제공합니다. 동적인 페이지를 제공하기 위해서 웹 서버는 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야 합니다. 동적인 페이지로 임의의 이미지만을 보여주는 페이지와 같이 사용자가 요청한 시점에 페이지를 생성해서 전달해 주는 것을 의미합니다. 여기서 웹 서버가 동적인 페이지..
더보기
-
[JAVA 21] Pattern Matching for switch - 컴도리돌이
스위치문과 null (switches and null) 전통적으로, switch 문과 표현식은 선택기 표현식이 null을 검증할 때, NullPointerException을 throw 합니다. 따라서 null을 테스트하기 위해 switch 바깥에서 테스트해야 했습니다. // Prior to Java 21 static void testFooBarOld(String s) { if (s == null) { System.out.println("Oops!"); return; } switch (s) { case "Foo", "Bar" -> System.out.println("Great"); default -> System.out.println("Ok"); } } java 21부터는 선택기 표현식의 값이 null일 ..
더보기
-
[PostgreSQL] Foreign Key (외래키, 관계 테이블) - 컴도리돌이
외래키는 한 테이블의 열이 다른 테이블의 기본 키(primary key)나 후보 키(candidate key)의 값을 참조하는 데 사용하는 제약 조건입니다. 즉 외래키는 데이터 무결성과 관계의 일관성을 유지하는 데 중요한 역할을 합니다. 데이터 무결성(Data Integrity)을 지키기 위해서는 데이터 무결성 제약조건에 대해 알고 있어야 합니다. 무결성 제약조건이란 데이터베이스의 정확성, 일관성을 보장하기 위해 저장, 삭제, 수정 등을 제약하기 위한 조건을 뜻합니다. PostgreSql에서는 다양한 방법으로 데이터 무결성을 제어할 수 있으며, 일반적으로 사용되는 제약조건 중에 외래 키(FOREIGN KEY) 제약 조건 이 있습니다. 외래 키 (Foreign Keys) 두 테이블 사이의 관계를 선언함으로..
더보기
-
[Design Pattern] 복합체 패턴(Composite Pattern)에 대해서 - 컴도리돌이
복합체 패턴(Composite Pattern)은 전체 - 부분 관계를 가진 객체들을 트리 구조로 구성하여 한 개체로 다루는 방법을 제공합니다. 이 패턴은 개별 객체와 복합 객체를 동일하게 취급하여 클라이언트가 단일 객체와 복합 객체를 구별하지 않고 사용할 수 있도록 합니다. 이 패턴은 특히 계층적 구조를 가진 객체를 다루거나, 여러 객체를 하나의 객체로 처리해야 하는 상황에 유용하게 활용됩니다. 복합체 디자인 패턴 구조 Component: 단일 객체(Leaf)와 복합 객체(Composite)가 구현하는 공통 인터페이스입니다. 이를 통해 클라이언트는 복합 객체와 단일 객체를 동일한 방식으로 다룹니다. interface component { void execute(); } Composite: 복합 객체로서,..
더보기
-
[JAVA][백준 18110][구현] solved.ac - 컴도리돌이
18110번: solved.ac 5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다. www.acmicpc.net 오랜만에 백준 문제를 푸는데 실버, 브론즈 문제도 버벅거리네요.🥲 이번 문제는 가벼운 구현 문제예요. 시간제한이 조금 힘들어서 정답 비율은 낮지만, 원래 배열과 BufferedReader를 사용하시는 분들이면 어렵지 않게 구현할 수 있을 거예요 😆 문제에서 상위 15 % 와 하위 15 %를 제외한 나머지 인원에 대한 평균을 출력하는 문제입니다. n을 초기 입력받아서 array 크기를 할당시켜 줍니다. 그리고 개행마다 숫자를 n만큼 ar..
더보기
-
[Tomcat] 톰캣 외부 경로 파일 업로드 - 컴도리돌이
외부에서 접근해야 하는 리소스를 webapp 폴더 하위에 있는 resource 파일 안에 저장을 하였습니다. 하지만 WAR 파일을 재배포할 때마다 업로드된 파일들이 사라지면서 재 업로드 해야 하는 경우가 있기에, 외부에서 접근하는 경로를 톰캣 상위 루트 경로로 변경하고, 서버에서도 업로드할 때 해당 루트 경로에 넣으려고 합니다. 1. 서버에서 루트 경로로 파일 업로드 Apache Commons FileUpload 및 서블릿 API 라이브러리 추가합니다. commons-fileupload commons-fileupload 1.4 javax.servlet javax.servlet-api 3.1.0 provided '@WebServlet' 어노테이션은 서블릿을 정의하고 매핑하는 데 사용되는 Java EE 웹 ..
더보기
-
[Tomcat] 톰캣에서 가상 호스트 및 웹 애플리케이션 설정하는 방법 - 컴도리돌이
톰캣에서 서블릿 컨테이너에 웹 애플리케이션을 배포하고 관리하기 위한 설정은 "호스팅(hosting)"이라고 합니다. 특히, 'server.xml' 파일에서 '' 엘리먼트를 사용하여 웹 애플리케이션을 호스팅 하고 설정하는 것에 그에 해당합니다. 이러한 호스팅 설정은 다양한 목적으로 사용될 수 있습니다. 특히 여러 개의 도메인이나 서브도메인을 하나의 톰캣 서버에서 운영하고자 할 때, 각각을 별도의 호스트로 설정하여 구분할 수 있습니다. 이때 호스트(host)는 가상 호스트(virtual host)로도 불릴 수 있습니다. 일반적으로 사용되는 'server.xml' 설정에서 '' 엘리먼트는 다음과 같이 생겼습니다. .... name: 호스트의 이름을 지정합니다. appBase: 웹 애플리케이션 파일들이 위치하는..
더보기
-
[Design Pattern] 추상 팩토리(Abstract Factory)에 대해서 - 컴도리돌이
추상 팩토리 디자인 패턴(Abstract Factory Design Pattern)은 객체 생성에 관련된 일련의 인터페이스를 제공하여, 관련 객체들의 생성을 캡슐화하고 클라이언트 코드가 구체적인 클래스의 인스턴스를 직접 생성하는 것을 피하도록 하는 디자인 패턴 중 하나입니다. 이 패턴은 주로 "팩토리"라 불리는 인터페이스를 통해 다양한 종류의 관련 제품을 생성하는 데 사용됩니다. 각각의 팩토리는 특정 제품군에 대해 추상화된 인터페이스를 제공하며, 클라이언트 코드는 이러한 인터페이스를 통해 제품을 생성합니다. 이는 객체 생성 로직을 클라이언트 코드로부터 분리함으로써 시스템의 유연성을 향상하고, 객체 간의 결합도를 낮추어 변경과 확장에 용이하게 만듭니다. 추상 팩토리 패턴 구조(Abstract Factory..
더보기
-
[ELK] 인덱스(생성/조회/삭제)와 도큐먼트(CRUD)에 대해서 - 컴도리돌이
Elasticsearch 인덱스는 일반적인 관계형 데이터베이스와 성격이 다릅니다. 인덱스는 도큐먼트를 저장하는 논리적 구분자이며, 도큐먼트는 실제 데이터를 저장하는 단위입니다. 도큐먼트는 엘라스틱서치에서 데이터가 저장되는 기본 단위로 JSON 형태이며, 하나의 도큐먼트는 여러 필드와 값을 갖고 있습니다. 이번 포스팅에서는 엘라스틱 서치가 도큐먼트에 데이터를 어떻게 저장하는지 알아볼려고 합니다. 인덱스(index) 인덱스는 도큐먼트를 저장하는 논리적 단위로, 관계형 데이터 베이스의 테이블과 유사한 개념입니다. 하나의 인덱스에 다수의 도큐먼트가 포함되는 구조이며, 동일한 인덱스에 있는 도큐먼트는 동일한 스키마를 가질 수 있습니다. 그리고 모든 도큐먼트는 반드시 하나의 인덱스에 포함돼야 합니다. 인덱스 이름에..
더보기
-
[git] git stash에 대하여 - 컴도리돌이
여러분이 작업하고 있는데 갑자기 브랜치를 바꿔야 할 때나, 혹은 당장 커밋하기에는 좀 이른 감이 있지만 다른 작업을 할 때, 그냥이라면 간단하게 코드 변경사항을 잠시 숨겨놓고 싶을 때가 있을 겁니다. 이럴 때에 사용하기 편한 것이 바로 git stash라고 할 수 있습니다. git stash 명령을 사용하면 작업한 디렉토리에서 수정한 파일들만 저장하게 됩니다. git stash를 사용하여 저장하면, 스택(Stack) 형식으로 저장하게 됩니다. git stash는 git으로 버전 관리를 하고 있는 파일들에 수정 내용을 임시로 저장하기 때문에 새롭게 생성된 파일을 저장되지 않습니다. 새롭게 생성한 파일도 함께 임시 저장하고 싶다면, git add로 새롭게 생성된 파일들을 git으로 관리하도록 한 후, git..
더보기
-
[PostgreSQL] 날짜 형식 검증 함수 - 컴도리돌이
페이지에서 데이터를 조회할때 날짜 형식에 맞지 않는 데이터로 인해서 페이지 에러가 발생할 때가 종종 존재합니다. 그럴 때마다 일일히 찾을 수 없기 때문에, 함수를 만들어서 편하게 사용하는 편입니다. 이번 포스팅에서는 보편적으로 사용할 수 있는 날짜 형식 검증 함수를 기록하려고 합니다. 입력받은 문자열 값이 null인 경우 false를 반환시킵니다. 그리고 입력받은 문자열을 date 형식으로 정상적으로 처리되면 true가 발생하게 되고, 만약 예외처리가 발생할 경우 false를 반환하게 될 것입니다. CREATE FUNCTION validation_check_date(str CHARACTER VARYING) RETURNS BOOLEAN AS $$ BEGIN IF str is NULL THEN RETURN ..
더보기
-
[JAVA] 자바 8 이후 스태틱 객체가 GC 대상이 된 이유 - 컴도리돌이
자바에서 스태틱 객체는 전역으로 사용할 수 있고, 코드 내에서 어디서든 참조할 수 있습니다. 그리고 스태틱에 대해서 정리하면서 스태틱은 GC의 대상이 아니기 때문에(스태틱은 객체 생성이 아니기 때문에), 무분별한 사용을 하면 안 된다고 알고 있었습니다. 하지만 이 내용은 java 8 버전 이전의 내용이었고, 자바 8부터는 스태틱 객체도 GC의 대상이 되었고, GC에 대한 간단한 설명과 스태틱 객체가 왜 GC의 대상이 되었는지 기록하려고 합니다. 참고로 java 8은 2014년 3월에 출시되었습니다. 🤒 메모리에 객체를 생성하면 Eden에 저장이 됩니다. 그리고 Eden 영역이 가득 차면, S1 또는 S2로 이동되고, 둘 중에 하나가 가득 차면 비어있는 곳으로 이동하게 됩니다. 그렇기 때문에 S1 또는 S..
더보기
-
[PostgreSQL] NLP 자연어 기반 구문 검색[Full-Text Search] - 컴도리돌이
Elasticsearch에 대해 정리할 때, 우연히 PostgreSQL에 대한 Full Text Search에 대한 포스팅한 글을 보게 되었습니다. 놀랍게도 PostgreSQL에서도 Full Text Search를 지원하고, 놀랍게도 제가 관리하는 페이지에서 데이터를 검색할 때 해당 함수를 이용해서 데이터를 조회를 하였습니다. 저의 무지함에 놀라며, 이번 포스팅에 해당 검색에 대해 조금 알아보려고 합니다. RDBMS에서 특정 단어에 대한 패턴 검색을 할 경우 LIKE와 와일드카드 '%'을 대게 사용합니다. SELECT * FROM products WHERE product_name LIKE '%app%'; LIKE 연산자와 '%' 와일드카드는 부분 문자열 일치를 수행합니다. 예를 들면, 'app'이 포함된..
더보기
-
[Elasticsearch] 엘라스틱 서치 역인덱스(Elasticsearch inverted index) - 컴도리돌이
이번 글에서는 엘라스틱서치(Elasticsearch)에서 데이터를 어떤 방식으로 저장하는지 알아보겠습니다.오늘 글의 주제는 역인덱스(inverted index) 구조에 대해서 알아보겠습니다. 일반적인 RDBMS에서 텍스트 형식으로 이루어진 컬럼에서, 특정 단어가 포함되어 있는지 확인하기 위해서는 다음과 같이 패턴을 검색할 수 있습니다. SELECT *FROM test_tableWHERE test_columns LIKE '%quokka%' 보통 와일드카드 '%'를 이용하여 특정 단어로 시작한, 끝 맺히는, 포함되어 있는 데이터를 조회할 때, LIKE 연산과 '%'을 사용하여 패턴 검색을 할 것입니다. 1. the cute white quokka2. the cute brown quokka3. the c..
더보기
-
[ELK] Elastic Stack에 대해서 - 컴도리돌이
이번에 회사에서 엘라스틱 서치에 대해서 도입을 한다. 하지만 해당 기술에 대해 무지하기 때문에 오늘부터 차근차근 공부할려고 한다. 오늘의 주제는 엘라스틱 스택에 대해 가볍게 내용 정리를 할려고 한다. 엘라스틱 스택(Elastic Stack) 엘라스틱 스택은 일반적인 빅데이터 파이프라인을 구성하기 위한 데이터 수집, 가공, 저장, 분석, 시각화에 필요한 모든 소프트웨어를 갖추고 있다. 비츠와 로그스태시는 데이터를 수집하고 가공하는 역할을 하며, 엘라스틱 서치는 저장하고 분석하는 역할을 담당한다. 마지막으로 키바나는 엘라스틱 서치에 저장된 데이터를 시각화하고 모니터링하는 역할을 수행한다. 엘라스틱 서치(Elastic Search) 엘라스틱 서치는 검색 엔진이지만, 다른 포털 사이트와 다르게 검색 엔진이 내부..
더보기
-
[Spring] @RequestMapping 어노테이션에 대해서 - 컴도리돌이
@RequestMapping @RequestMapping은 Spring Framework에서 컨트롤러 메서드에 대한 매핑을 지정하는 데 사용되는 어노테이션입니다. 이 어노테이션은 클래스 수준 또는 메서드 수준에서 사용될 수 있습니다. 클래스 수준에서 사용할 경우, 해당 클래스의 모든 메서드에 적용됩니다. @Controller @RequestMapping("/example") public class ExampleController { @RequestMapping("/hello") public String hello() { return "helloPage"; } } // 위에 코드에서 클라이언트에서 "/example/hello" 경로에 요청을 보내면 // 서버에서는 hello 메서드가 실행되면서 클라이언트한..
더보기
-
[Spring] @SpringBootApplication의 내부적으로 수행하는 작업 - 컴도리돌이
@SpringBootApplication @SpringBootApplication은 Spring Boot FrameWork에서 주요한 어노테이션 중 하나로, Spring Boot Application을 개발하는 데 사용 됩니다. 해당 어노테이션을 사용하면 Spring Boot는 Application 설정을 자동으로 구성하고, 필요한 Spring Bean 들을 자동으로 검색하여, classpath에 있는 라이브러리들을 기반으로 자동 구성을 활성화합니다. @SpringBootApplication에서는 내부적으로 다음과 같은 일을 수행합니다 @SpringBootConfiguration Spring Boot에서 사용되는 특수한 유형의 @Configuration으로, 설정 클래스를 지정할 수 있습니다. 클래스 내..
더보기
-
[네트워크] TCP/IP 모델에 대해서 - 컴도리돌이
TCP/ IP (Transmission Control Protocol/ Internet Protocol) 현재의 인터넷에서 사용하는 프로토콜 그룹이며, 상호작용하는 모듈로 이루어진 계층적 프로토콜이다. 각 모듈을 특정한 기능을 제공하며 원래의 TCP/IP 프로토콜은 하드웨어에 설치된 4가지 소프트웨어 계층으로 정의되지만 현재는 5 계층으로 간주한다. 응용 계층(Application Layer) - 프로토콜 : HTTP, SMTP, FTP - PDU : Message OSI 모델의 최상위 계층으로 다양하게 존재하는 응용 환경에서 공통적으로 필요한 기능을 다룬다. 시스템 간의 응용 처리는 상호 간에 통신하면서 일련의 업무를 처리할 수 있도록 필요한 서비스 기능을 제공한다. 이메일, 파일 전송, 웹사이트 조회..
더보기
-
[JAVA][백준 11062][게임 이론][DP] 카드 게임 - 컴도리돌이
11062번: 카드 게임 근우와 명우는 재미있는 카드 게임을 하고 있다. N개의 카드가 일렬로 놓여 있다. 각 카드에는 점수가 적혀있다. 근우부터 시작하여 번갈아가면서 턴이 진행되는데 한 턴에는 가장 왼쪽에 있는 www.acmicpc.net 근우가 왼쪽/오른쪽을 선택했을 때 명우가 선택할 카드의 합이 최소가 되어야 한다. 맨 왼쪽/오른쪽 카드의 수만 비교해서는 최선의 선택이 되지 않기 때문에 다이나믹 프로그래밍으로 접근해야 한다. 여기서 주의할 점은 근우와 명우의 차례에 따라서 구하는 식이 다르기 때문에 2차원 배열을 사용해야 한다. 근우와 명우가 카드를 선택하다가 남은 카드의 상태를 점화식을 세우고, dp [i][j] = i~j의 카드가 있을 때 근우가 선택할 수 있는 최대 합을 만들어야 한다. n이 ..
더보기
-
[JAVA][백준 2473][투 포인터] 세 용액 - 컴도리돌이
2473번: 세 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 www.acmicpc.net 세 용액의 합이 0과 가장 근사한 값을 찾아야 한다. 용액의 수가 5000 이하이기 때문에 최악일 경우 5000 * 2500 = 7500000의 연산을 계산하기 때문에 시간 복잡도에 대한 걱정 없이 해결할 수 있었다. 기준점 i번째의 값부터 n-1의 값까지 j번째와 k번째의 합들 중에서 최솟값을 구했다. 여기서 j번째는 i+1, k번째는 n-1번째로 설정하여 투 포인터 알고리즘으로 해결하였다. i, j, k번째의 합이 비교대상 comp과 비..
더보기
-
[JAVA][백준 7570][그리디] 줄 세우기 - 컴도리돌이
7570번: 줄 세우기 입력은 2 개의 줄로 이루어져 있다. 첫 줄에는 어린이 수를 나타내는 정수가 주어진다. 둘째 줄에는 처음에 줄서있는 어린이들의 번호가 차례대로 주어진다. 주어진 번호들 사이에는 공백이 하 www.acmicpc.net 해당 문제는 놀랍게도 가장 긴 증가수열 알고리즘을 활용해서 풀어야 한다. 생각보다 어려워서 구글링 하여 다른 분들의 코드를 확인하여 해결할 수 있었다. 다른 분들의 코드가 현저히 짧은 것을 보고 상심이 매우 컸다. 7570 문제는 줄의 맨 앞이나 맨 뒤로만 어린이들을 보내서 줄을 세워야 한다. 그렇기 때문에 연속된 수들 중 가장 긴 증가수열의 길이를 구하고 n에서 구한 길이를 빼면 최소 횟수를 구할 수 있다.
더보기
-
[JAVA][백준 11657][벨만포드] 타임머신 - 컴도리돌이
문제에서 시작 도시 A, 도착 도시 B 그리고 버스를 타고 이동하는 데 걸리는 시간 C가 주어졌다. 여기서 중요한 부분은 이동하는 데 걸리는 시간 C가 음수인 경우도 있다는 점이다. 웬만한 그래프 문제를 풀었다면 이동 시간이 음수가 주어지면 떠올려하는 알고리즘은 하나밖에 존재하지 않는다. 벨만 포드 알고리즘 벨만 포드 알고리즘은 정점의 개수만큼 반복문을 돌려서 모든 간선들을 확인하여 노드 간의 최단 거리를 갱신하는 알고리즘이다. 여기서 음수 간선 순환이 발생하는지 체크하고 싶다면 정점의 개수만큼 반복문을 돌리면 된다. n번째 반복문을 돌리는데 최단 거리가 다시 갱신이 된다면 음의 사이클이 존재하는 것이다.
더보기
-
[JAVA][백준 1092][Greedy, Sort] 배 - 컴도리돌이
1092번: 배 첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 크레인의 무게 제한이 주어진다. 이 값은 1,000,000보다 작거나 같다. 셋째 줄에는 박스의 수 M이 주어진다. M은 10,000보 www.acmicpc.net 크레인의 무게 제한과 박스의 무게를 "crain", "box" 이름으로 ArrayList로 담았다. 그리고 해당 ArrayList들을 모두 내림차순 정렬을 시켰다. ArrayList를 내림차순 정렬을 할 때는 Collection.reverseOrder() 함수를 sort안에 명시해주어야 한다. 정렬된 두 ArrayList의 첫 번째 인덱스 값을 비교한다. 만약 크레인의 첫 번째 값이 박스의 첫 번째 값보다 작을 경우 모든 박스를 담을 수 없기 때..
더보기
-
[JAVA][백준 8980][그리디, 정렬] 택배 - 컴도리돌이
8980번: 택배 입력의 첫 줄은 마을 수 N과 트럭의 용량 C가 빈칸을 사이에 두고 주어진다. N은 2이상 2,000이하 정수이고, C는 1이상 10,000이하 정수이다. 다음 줄에, 보내는 박스 정보의 개수 M이 주어진다. M은 1이 www.acmicpc.net
더보기
-
[Spring][Security] 스프링 시큐리티(Spring Security)에 대해서 - 스프링 시큐리티 아키텍처, 필터 - 컴도리돌이
스프링 시큐리티(Spring Seucirty) 스프링 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크. 서블릿 필터와 이들로 구성된 필터 체인으로의 위임 모델을 사용한다. 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안 관련 로직을 작성하지 않아도 된다. 보안 용어 인증(Authenticate) : 접근하려는 유저의 권한을 확인하는 절차 ex) 회원가입, 로그인 인가(Authorization) : 인증된 사용자에 대해서 권한을 확인하고 허락하는 것. 접근 주체(Principal) : 보호된 대상에 접근하는 대상 인증 아키텍처 1. 유저가 폼(form)을 통해 로그인 정보를 입력하고 인증 요청을 보낸다. Authentication..
더보기
-
[알고리즘][누적합] 슬라이딩 윈도우 알고리즘(Sliding Window Algorithm), 카데인 알고리즘(Kadane`s Algorithm), 원형 배열 부분집합 최대 합 구하기 - 컴도리돌이
오늘 기업 코테를 보았다. 누적합에 대해 2문제씩이나 출제가 되었다. 문제를 다 풀긴 했지만 효율성에서 어떻게 될지 모르겠다. 오늘 코테 풀이에 아쉬움이 남아서 누적합에 대해 다시 돌아보는 시간을 가져보자. 코테의 첫 번째 누적 합의 문제는 연속된 k개의 값들의 합 중에서 가장 큰 값을 출력하는 문제였다. 나는 해당 문제를 슬라이딩 윈도우 알고리즘으로 해결하였다. 슬라이딩 윈도우 알고리즘(Sliding Window Algorihtm)은 배열이나 리스트의 요소의 일정 범위의 값을 비교할 때 사용하면 유용한 알고리즘이다. 예르 들어 정수로 이루어진 배열 {1, 4, 2, 5, 1}에서 길이가 2인 서브 배열의 합계가 가장 큰 서브 배열을 구할 때, 해당 알고리즘을 이용해서 해결한다. 슬라이딩 윈도우는 크기가..
더보기
-
[Python][백준 2632][누적합] 피자판매 - 컴도리돌이
2632번: 피자판매 첫 번째 줄에는 손님이 구매하고자 하는 피자크기를 나타내는 2,000,000 이하의 자연수가 주어진다. 두 번째 줄에는 A, B 피자의 피자조각의 개수를 나타내 는 정수 m, n 이 차례로 주어진다 (3 ≤ m, n www.acmicpc.net 피자 A와 피자 B에서 나올 수 있는 피자 조각의 합 경우의 수를 각각의 딕셔너리에 저장한다. 하나의 피자에서 나올 수 있는 모든 경우의 수를 탐색한다. 하나의 피자에 존재하는 조각의 개수가 1000개 이하이므로 반복문 2개를 중첩하여 모든 경우의 수를 탐색하여도 시간 초과가 발생하지 않는다. 출력 딕셔너리_A [문제에서 요구하는 피자 사이즈] + 딕셔너리_B [문제에서 요구하는 피자 사이즈] + 딕셔너리_A [A에 있는 값] + 딕셔너리_B..
더보기
-
[JAVA][백준 17845][배낭문제] 수강 과목 - 컴도리돌이
17845번: 수강 과목 첫줄에 서윤이의 최대 공부시간 N (1 ≤ N ≤ 10,000), 과목 수 K (1 ≤ K ≤ 1,000)이 공백을 사이에 두고 주어진다. 이후 K개의 줄에 중요도 I (1 ≤ I ≤ 100,000), 필요한 공부시간 (1 ≤ T ≤ 10,000)이 www.acmicpc.net 17845번 DP문제 중에 knapsack 문제로 해결해야 합니다. bag[M][N]을 1부터 M+1번째 과목들을 대상으로 최대 N시간을 써서 얻을 수 있는 가장 큰 중요도를 구해야 합니다. 현재 i번째 시간으로 들을 수 있을 경우 이전 과목을 들은 경우와 현재 i번째 시간 전 + 현재 i번째 우선도를 비교해서 최대 값으로 bag [i][j]를 갱신해줘야 합니다. 현재 i번째 시간으로 듣지 못할 경우는 이..
더보기
-
[JAVA][백준 12015][이분 탐색] 가장 긴 증가하는 부분 수열2 - 컴도리돌이
12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net 해당 문제는 이분 탐색으로 해결했습니다. 주어진 N만큼 반복문을 시행합니다. arr의 맨 뒤 값보다 현재 주어진 값보다 작을 경우 arr의 맨 뒤에 해당 값으로 업데이트 해줍니다. 그 반대일 경우 이분 탐색으로 주어진 값의 인덱스를 찾아줍니다. 파이썬 풀이 [Python][백준 12015][이분 탐색] 가장 긴 증가하는 부분 수열 2 - 컴도리돌이 풀이 과정 해당 문제는 bisect 라이브러리를 사용해서 해결하였다. bisect에 대해서는 아래 링크를 참조하면 좋..
더보기
-
[Python][백준 12015][이분 탐색] 가장 긴 증가하는 부분 수열 2 - 컴도리돌이
풀이 과정 해당 문제는 bisect 라이브러리를 사용해서 해결하였다. bisect에 대해서는 아래 링크를 참조하면 좋다. [Python] bisect - 컴도리돌이 알고리즘 문제를 해결하다가 다른 분의 블로그에서 제가 푼 알고리즘 문제를 파이썬에서 제공하는 표준 라이브러리인 bisect를 이용해서 간단하게 문제를 해결한 것을 보고, 요번 기회에 bisect 라 comdolidol-i.tistory.com 1. 입력받은 배열의 0번째 인덱스 값부터 순차적으로 반복문을 시행한다. 2. arr가 비어있으면 x 값을 arr에 insert 한다. 3. 현재 x 값이 arr의 마지막 인덱스 값보다 크면 insert 시킨다. 4. 마지막 인덱스 값보다 크지 않으면 bisect_left 함수를 이용해서 x값보다 같거나..
더보기
-
[Java][백준 2470][투 포인터] 두 용액 - 컴도리돌이
2470번: 두 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00 www.acmicpc.net 해당 문제는 투 포인터 알고리즘으로 해결하였습니다. 두 용액의 합이 0과 가장 근사한 한 쌍을 찾아야 하는 문제입니다. 입력받은 용액의 배열을 정렬을 시키고 왼쪽 인덱스의 값과 오른쪽 인덱스의 값을 더해서 절댓값이 minValue보다 작으면 출력 값(ans1, ans2)과 minValue를 업데이트합니다. 만약 minValue가 0이면 ans1과 ans2를 출력시키고 return 해줍니다. 왼쪽 인덱스의 값과 오른쪽 인덱스의 값..
더보기
-
[Python][백준 2470][투 포인터] 두 용액 - 컴도리돌이
풀이 과정 해당 문제는 단순한 투 포인터 문제이다. 두 값의 합이 0과 가까운 쌍을 찾으면 끝이다. 1. 주어진 x 배열을 정렬시킨다. 2. 문제에서 수들의 합이 매우 크기 때문에 minV를 매우 큰 값으로 설정하였다. 3. 투 포인터를 사용하기 때문에 0번째 인덱스와 n-1 인덱스부터 시작한다. 4. 오른쪽 인덱스 s와 왼쪽 인덱스 e의 합을 m으로 지정한다. 5. 절댓값 m이 minV보다 작을 경우 minV를 m으로 업데이트해준다. ans를 현재 x [s], x [e]로 업데이트해준다. 6. minV이 0이면 반복문을 종료하고 현재 ans을 출력한다. 7. m 값이 0보다 작을 경우 오른쪽 인덱스를 증가시키고 반대일 경우 왼쪽 인덱스를 감소시킨다. 풀이 코드 n,*x= map(int,open(0).r..
더보기
-
[Python][백준 2234][BFS] 성곽 - 컴도리돌이
풀이 과정 본 문제는 전형적인 BFS문제이다. 왜냐하면 연결되어 있는 방의 개수를 물어봤기 때문이다. 부가적으로 특이한 요소를 첨가하였다. 각 좌표들 간에 연결되었는지를 15 이하의 값으로 주어져있다. 0~15 (?) 문제에서 언급한 힌트대로 이 문제는 좌표 이동을 비트 마스킹을 해준다. 하지만 비트 마스킹이 익숙하지 않아서,,, 나는 문자열로 표시를 하였다. 물론 하는 방법은 비트 마스킹이랑 똑같다..! "0000" ~ "1111" 맨 왼쪽부터 서북 동남을 의미하고 1은 이동 불가(벽으로 연결)를 의미하고 0은 이동 가능을 의미한다. 1. m*n 만큼 반복문을 돌려서 해당 (i, j) 위치를 방문하지 않을 경우 BFS 탐색을 한다. 2. 현재 위치 값을 bin함수를 이용하여 이진수를 나타내고 크기를 4..
더보기
-
[JAVA][백준 2234][BFS][비트마스킹] 성곽 - 컴도리돌이
문제에 대한 대략적인 설명은 다음 링크에 적어놨습니다. ㅎㅎㅎ [Python][백준 2234][BFS] 성곽 - 컴도리돌이 풀이 과정 본 문제는 전형적인 BFS문제이다. 왜냐하면 연결되어 있는 방의 개수를 물어봤기 때문이다. 부가적으로 특이한 요소를 첨가하였다. 각 좌표들 간에 연결되었는지를 15 이하의 값으로 comdolidol-i.tistory.com 해당 링크는 파이썬으로 풀어서 혹시 이해가 안되시는 분을 위해 주석을 달아놨습니다. 🥲 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Main { static int n,m; static int [][] arr; static ..
더보기
-
[JAVA][백준 2122][그리디 정렬] 센서 - 컴도리돌이
2212번: 센서 첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있 www.acmicpc.net 문제 설명은 밑에 링크를 타시고 보시면 됩니다. 😶🌫️ [Python][백준 2212][정렬][그리디] 센서 - 컴도리돌이 풀이과정 해당 문제는 좌표를 단순히 정렬시켜서 센서들 간의 거리를 저장하고 정렬하여 n-k까지 합을 구하면 된다. 여기서 n-k까지 합을 구하는 이유를 물어본다면,, 문제를 그리면서 푸는 것을 comdolidol-i.tistory.com import java.io.BufferedReader; import java...
더보기
-
[Python][백준 2212][정렬][그리디] 센서 - 컴도리돌이
풀이과정 해당 문제는 좌표를 단순히 정렬시켜서 센서들 간의 거리를 저장하고 정렬하여 n-k까지 합을 구하면 된다. 여기서 n-k까지 합을 구하는 이유를 물어본다면,, 문제를 그리면서 푸는 것을 추천한다. 🙄 1. 센서 위치를 정렬시킨다. 2. x의 0번째 인덱스부터 n-1 인덱스까지 다음 좌표까지의 거리를 저장한다. 3. 다음 좌표까지의 거리들을 정렬시킨다. 4. 정렬된 좌표 간의 거리 리스트에서 n-k까지 합을 구하여 출력한다. 풀이 코드 n,k,*x = map(int,open(0).read().split()) ;x.sort() print(sum(sorted([x[i+1] - x[i] for i in range(n-1)])[:n-k]))
더보기
-
[Python][백준 2133][DP] 타일 채우기 - 컴도리돌이
풀이과정 해당 문제는 뭔가 일단 규칙성을 찾아야 하게끔 생겨 버렸다. 😶🌫️😶🌫️ 일단 n이 홀수이면 0인 거 알겠지만, n이 짝수일 때 규칙성을 찾는데 애를 먹었다. 일단 n이 2일 때는 3이다. 그다음 n이 4일 때는 11이다. 근데 여기서 n이 2일 때 경우의 수 각각 2,2이기 때문에 2 * 2에 새로운 모양 2개를 더해준 값이다. 그렇다면 일단 dp [2] * dp [2] + 2라고 표현할 수 있다. 그다음 n이 6일 때는 41이다. dp [4] * dp [2] + dp [2] * 2 + 2 그다음 n이 8일 때는 dp [6] * dp [2] + (dp [4] + dp [2] ) * 2 + 2 그다음 n이 10일 때는 dp [8] * dp [2] + (dp [6] + dp [4] + dp [..
더보기
-
[JAVA][백준 20437][문자열] 문자열 게임 2 - 컴도리돌이
20437번: 문자열 게임 2 첫 번째 문자열에서 3번에서 구한 문자열은 aqua, 4번에서 구한 문자열은 raquator이다. 두 번째 문자열에서는 어떤 문자가 5개 포함된 문자열을 찾을 수 없으므로 -1을 출력한다. www.acmicpc.net 자세한 풀이과정은 다음 링크에 걸어놓았습니다. 물론 파이썬으로 해결해서 코드가 조금 더 간결하고 쉽게 해결했지만, 전체적인 흐름은 똑같습니다. 1. 주어진 문자열을 반복문을 돌려서 해당 문자열이 몇 번째 인덱스에 나왔는지 저장을 합니다. 2. 인덱스 정보가 담긴 문자열 배열을 알파벳의 개수(26)만큼 반복문을 돌립니다. 3. 배열의 크기가 주어진 개수보다 작을 경우 continue 개수를 포함할 경우 인덱스 간에 거리를 구해서 min, max를 업데이트 합니다..
더보기
-
[Python][백준 20437][문자열] 문자열 게임 2 - 컴도리돌이
풀이과정 해당 문제는 시간 초과를 걸리 줄 알았는데, 생각보다 쉽게 해결되어서 허무(?)했던 문제였다. (원래 시간 초과 4개 걸리고 해결해야 짜릿한데,,🙄🙄) 1. 입력받은 w를 enumerate로 인덱스 번호(i), 문자열(str)로 열거하여 dictionary(ww)에 문자열의 인덱스를 삽입해준다. 2. 각 알파벳의 인덱스 정보를 담고 있는 ww를 반복문을 다음과 같이 수행한다. 3. 해당 알파벳의 인덱스 리스트를 'str_idx_list'라고 설정하였다. 4. 해당 리스트의 크기가 k보다 작으면, 문제에서 주어진 3,4번 조건을 만족하지 못하기 때문에 continue를 시킨다. 5. len_list는 k개를 포함하는 문자의 문자열 길이를 담는 리스트이다. len_list에 str_idx_list ..
더보기
-
[Python][백준 1194][BFS][bit masking] 달이 차오른다, 가자. - 컴도리돌이
풀이과정 해당 문제는 방문 표시만 제대로 하면 쉽게 해결할 수 있는 문제이다. 물론 방문 표시가 생각보다 까다롭다. 😂 시작점에서 끝점까지 도달하는 최단 거리는 너비 우선 탐색(BFS)으로 구현하면 된다. 그렇다면 이 문제의 핵심은 방문 표시이다. 탈출을 하기 위해서는 '.' 공간만 이용할 수 있다. 물론 주어진 n*m 행렬 맵에서는 키라는 특이한 요소를 첨가했다. 키의 종류는 a, b, c, d, e, f 총 6가지이며, 키의 종류 따른 문의 종류도 A, B, C, D, E, F 총 6가지이다. 문제에서는 탈출구까지 가는 길에 문이 있으면 해당 문에 맞는 키 값을 소유하고 있어야 한다. 그렇기 때문에 BFS 탐색할 때 방문 표시를 가지고 있는 키 값들에 따라 해주어야 한다. 키의 종류는 총 6가지이다...
더보기
-
[Spring] 스프링 빈(Bean)에 대해서 - 컴도리돌이
[Spring Boot] 스프링 제어의 역전(Inversion of Control)과 의존성 주입(Dependency Injection - DI)에 대해서 - 1. 제어의 역전(Inversion of Control) 정의 및 예제 2. 의존성 주입(Dependency Injection) 정의 및 예제 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성하게 하여 가독성 및 코드의 comdolidol-i.tistory.com [Spring Boot] 스프링에 대해서 - 컴도리돌이 스프링(Spring)의 정의 스프링(Spring)은 자바(JAVA) 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임 워크이다. 위에 말은 스프링에 대해 잘 알려진 대표적인 정의이다. 하지만 스프링을 c..
더보기
-
[Python][백준 10972][알고리즘 - next permutation] 다음 순열 - 컴도리돌이
10972번: 다음 순열 첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다. www.acmicpc.net 문제 풀이에 도움 되었던 블로그 😊 [알고리즘] Next Permutation NextPermutation 현 순열에서 사전 순(오름차순)으로 다음 순열을 생성합니다. 즉 배열을 가장 작은 값으로 정렬한 뒤, 한 자리씩 swap하면서 출력합니다. 만약 숫자배열이라면 각각의 자리를 합해서 velog.io 문제 풀이 해당 문제는 permutation 알고리즘에 대해 알고 있으면 쉽게 문제를 해결할 수 있다. c++에서는 알고리즘 라이브러리에서 next_permutation을 제공하고 있고, python에서는 itertools에..
더보기
-
[Python][백준 23817][BFS, DFS, BruteForce] 포항항 - 컴도리돌이
23817번: 포항항 첫번째 예제의 경우 오른쪽 3칸, 왼쪽 1칸, 아래쪽 3칸, 오른쪽 1칸, 왼쪽 3칸으로 총 11칸 이동하여 5개의 식당을 방문할 수 있다. 두번째 예제의 경우 장애물에 가로막혀 5개의 식당을 방문할 수 www.acmicpc.net 풀이과정 해당 문제를 해결하려고 많은 시행착오가 있었습니다. 😂 맞왜틀.. python3로는 해결할 수 없는 건가.. 실력이 부족하여 해결하지는 못했지만 혹시 해결하신 분 있으시면 댓글로 달아 주시면 감사하겠습니다. 😊 1. 해당 문제는 dfs, bfs 둘 다 사용하였다. 2. 데이터를 입력받을 때 "S"와 "K"의 좌표를 미리 dist 배열에 튜플 형식으로 입력받았다. 입력받을 때는 "S"에서 시작하기 때문에 dist 배열의 0번째 인덱스로 두었다. 나..
더보기
-
[Python][백준 14438][세그먼트 트리] 수열과 쿼리 17 - 컴도리돌이
14438번: 수열과 쿼리 17 길이가 N인 수열 A1, A2, ..., AN이 주어진다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오. 1 i v : Ai를 v로 바꾼다. (1 ≤ i ≤ N, 1 ≤ v ≤ 109) 2 i j : Ai, Ai+1, ..., Aj에서 크기가 가장 작은 값을 www.acmicpc.net 풀이 과정 해당 문제는 세그먼트 트리를 알고 있어야 해결할 수 있습니다. 쿼리의 개수가 십만 개인데 배열의 크기마저 최대가 10^9입니다. 해당 문제를 단순하게 인덱스 사이의 min 값으로 출력하게끔 설정하면 0.1초 만에 시간 초과를 보게 될 것입니다. 😶🌫️ 그렇다면 세그먼트 트리가 무엇인가? 배열의 "연속적인" 구간 합 또는 구간의 min, max 값을 찾을 때 사용하는 알고리..
더보기
-
[Python][백준 17090][DFS] 미로 탈출하기 - 컴도리돌이
17090번: 미로 탈출하기 크기가 N×M인 미로가 있고, 미로는 크기가 1×1인 칸으로 나누어져 있다. 미로의 각 칸에는 문자가 하나 적혀있는데, 적혀있는 문자에 따라서 다른 칸으로 이동할 수 있다. 어떤 칸(r, c)에 적힌 문 www.acmicpc.net 풀이 과정 해당 문제는 DFS로 접근하였습니다. 똑같은 경로로 방문할 경우가 있을 때는 DFS로 접근하는 편이라,,😊 1. n, m 그리고 미로 그래프를 입력받는다. 2. 방문 표시를 하기 위해 "visited" 이름으로 n x m 크기의 배열을 생성한다. 3. n x m 만큼 반복문을 돌려준다. 해당 (i, j) 좌표로 시작하는 경로로 탐색한 경우가 없을 경우 dfs 탐색 시작. 4. DFS 탐색 4-1) 현재 좌표 값(x, y)이 미로를 탈출할..
더보기
-
[Python][백준 17370][DFS][미해결] 육각형 우리 속의 개미 - 컴도리돌이
17370번: 육각형 우리 속의 개미 무한히 많은 정육각형이 서로 맞닿아 놓인 형태의 개미 우리가 있다. 다음 그림과 같은 형태이고, 하얀색 변으로만 개미가 다닐 수 있다. 개미 우리의 모습 곤충 관찰이 취미인 유이는 세 정육각 www.acmicpc.net 해당 문제는 정말 주어진대로 문제를 풀었습니다. 똑같은 곧을 방문한 적이 있으면 출력 값을 1 더해주고 반환해주고, 개미 놈이 이동할 수 있는 경우를 다 설정하여 해당 방향에서 양 갈래 길로 가는 경우로 dfs 탐색을 해주었습니다.. 하지만 python으로는 이렇게 주어진 대로 문제를 해결하면 시간 초과가 발생하네요.. 경우의 수가 1부터 22까지이기 때문에 미해결 코드로 1부터 22까지 출력해서 밑에 코드로 제출했더니 통과가 되었네요.. print(..
더보기
-
[Python][백준 23741][DFS] 야바위 게임 - 컴도리돌이
23741번: 야바위 게임 첫 번째 줄에 정점 수 $N$, 간선 수 $M$, 게임 시작 시 공이 놓여있는 정점 번호 $X$, 공이 든 컵이 움직인 횟수 $Y$가 주어진다. ($1 \leq N, Y \leq 10^3$, $1 \leq M \leq 10^4$, $1 \leq X \leq N$) 다음 줄부터 $M$ www.acmicpc.net 풀이과정 멍청한 상원이.. 그거 하나 제대로 기억 못 해서 나를 이렇게 힘들게 하다니,, 🤦♂️🤦♂️ 해당 문제는 DFS로 접근하였습니다. 아마도 BFS로 접근하여도 무리 없이 문제를 해결할 거예요 시작 시 공이 놓여있는 정점 번호(x)부터 시작하여서 연결된 다른 정점으로 이동해서 이동 횟수가 Y인 정점을 저장해주면 됩니다. 하지만 해당 정점으로 이동할 때 정점으로 ..
더보기