전체 글
Java Stream(스트림)은 원본 데이터를 변경할 수 있다!?
나의 의문점을 말하기전에, 스트림이 무엇인지 간단하게 살펴보자. 1. 스트림(Stream) 이란? Java 8부터 도입된 데이터 처리 기능 데이터 소스에서 데이터를 추상화하여 처리할 수 있도록 도와줌 컬렉션, 배열, 파일 등의 데이터 소스에서 데이터를 읽고, 중간 처리 및 최종 처리하여 원하는 결과를 만듦 스트림은 기존 데이터 소스의 요소를 가져와 중간 처리 연산을 수행하고 새로운 Stream으로 반환함 중간 처리 연산은 lazy evaluation 방식으로 동작하기에 최종 처리 연산이 호출될 때만 수행됨 즉, 중간 처리 연산을 호출해도 즉각적인 연산이 되지 않음 최종 연산이 수행되어야 스트림의 요소들이 중간 처리 연산을 거쳐 최종 연산에서 소모됨 함수형 프로그래밍 개념을 적용하여 작성했기에 가독성과 유..
인덱스(index)란?
1. 인덱스란? DB 테이블에 대한 검색 속도를 향상시켜주는 자료구조 인덱스는 보통 B-Tree로 구현되며, 다른 것으로는 Hash Table, Bitmap 등이 있음 인덱스를 테이블의 특정 컬럼에 생성하면 해당 컬럼의 값을 정렬하여 별도의 메모리 공간에 데이터를 물리적 주소와 함께 저장함 인덱스는 insert, update, delete 와 같은 데이터 변경 작업을 느리게 할 수 있지만, select와 같은 검색 작업은 빠른 수행 가능 인덱스는 적절하게 설계하고 유지보수하는 것이 DB 성능 향상에 중요한 역할을 함 예를 들면, 책에서의 목차 또는 색인이라 볼 수 있다. 목차를 보고 빠른 내용을 찾을 수 있기 때문이다. 1-1. 왜 인덱스를 사용하면 검색 속도가 빠를까? 기존 where 문으로 특정 조건..
Strategy Pattern(전략 패턴)이란?
🚀 전략 패턴이란? 정책 패턴(Policy Pattern)이라고도 불림 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 사용할 수 있게 해줌 객체의 행위를 변경하고 싶은 경우 직접 수정하지 않고 전략이라 불리는 캡슐화한 알고리즘을 변경해줌으로써 유연하게 확장하는 방법 🚀 강아지로 예시 코드 작성해보기 먼저 강아지를 만들어야한다고 생각합니다. 강아지는 다양하고, 각각 행동(소리와 움직임)이 다릅니다. 이 때 어떻게 코드를 작성할 수 있을까요? 1. 상속을 이용 같은 행동을 하는 강아지들이라면 상관없지만 다른 행동을 하는 강아지들이 있을 수 있습니다. 코드 재사용성을 위해 상속을 이용하는 것도 좋지만, 불필요한 유지보수가 크게 늘어날 수 있습니다. 즉, 모든 서브클래스에서 같은 행동을 하는 것이..
Delegate Pattern(델리게이트 패턴, 위임 패턴)이란?
* 23.03.29 코드수정 Delegate 패턴이 '헤드퍼스트 디자인 패턴' 도서에 나와있지 않아서 정리해보고자 한다. 아무래도 Decorator 패턴 또는 strategy 패턴과 비슷하기 때문일까? 또한, 이 Delegate 패턴이 Decorator 패턴이랑 혼동된 블로그 글도 나와있기에 힘들었다. 그리고 Strategy 패턴과 유사한 부분이 있어서 이 점도 많이 헷갈렸다. 🤔 Delegate 패턴이란? delegate는 '위임하다' 라는 사전적 의미를 가지고 있음 즉, 객체가 자신의 기능을 다른 객체에게 위임하여 기능을 실행하는 디자인 패턴 객체 간의 결합도를 낮춰서 유지보수성과 확장성을 높이는데 사용됨 예를 들면 다음과 같다 A는 B의 기능을 사용하고 싶을 때, A가 B의 기능을 직접 구현하지 않..
트랜잭션을 사용할 때 각 DB들의 기본 격리 수준은 무엇일까?
스프링 프레임워크를 사용한다면 @Transactional 을 Service단에 붙여서 자주 사용할 것이다. 이 경우 아래와 같이 isolation (격리수준)이 default(기본값)으로 지정된다. @Transactional의 옵션인 isolation의 기본값은 Isolation.DEFAULT 라고 한다. 그렇다면 Isolation.DEFAULT란 무엇일까? 우선 Isolation은 TransactionDefinition 인터페이스에 해당하는 Transactional 어노테이션과 함께 사용할 트랜잭션 격리 수준(transaction isolation levels)을 나타내는 열거형(Enumeration)이다. 열거형 값은 다음 5가지가 있다. DEFAULT READ_UNCOMMITTED READ_COMM..
스프링부트 실행 시 IllegalStateException 발생
이번에는 스프링부트를 실행하면 발생하는 java.lang.IllegalStateException 예외이다. java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'webController' method 모호한 매핑이다. 'webController' 메서드를 매핑할 수 없다. 보자마자 WebController 클래스의 메서드가 뭔가 잘못되었다는것을 느꼈습니다. 그래서 해당 클래스를 처음부터 끝까지 찍어달라고 했습니다. 필드가 중간에 있어서 불편하시겠지만 일단 넘어가고, 잘 살펴보면 "/" 의 경로를 가진 메서드가 2개 있습니다. index() 와 index(Model model) 메서드가 문제였습니다. 같은 경로에 같은 HTTP 메서드이므로 중복이..
포스트맨으로 url 요청했는데 405 에러
비대면으로 하다보니 원격으로 에러를 고치는 상황이 많은데 역시 화면공유가 제일 빨리 에러를 찾을 수 있는 것 같다. 이번에는 api가 잘 작동하는지 요청을 해보았는데 405 에러가 뜬다고 한다. 포스트맨으로 하면 이렇게 에러 내용을 보기 편하게 만들어줘서 이게 좋은 것 같다. 브라우저는 이렇게 뜨긴 하지만 초보자한테는 포스트맨이 더 좋아보인다..! 포스트맨의 에러 내용을 살펴보면 HTTP 상태코드 405인 Method Not Allowed이다. 메서드가 허용되지 않았다고하며 'GET' 메서드를 지원하지 않는다고 한다. 그리고 해당 경로는 "/api/posts" 이기 때문에 이 메서드를 살펴보면 된다. 위에서는 GET으로 요청했지만 만든 것은 POST 였기 때문에 해당 405 에러가 뜬 것이다. 빠른 해결..
스프링 부트 의존관계 주입 에러
스터디를 하면서 내가 본 적 없는 에러와 예외들이 나와서 기록해보고자 한다. Parameter 0 of constructor in com.example.study.ApiController required a bean of type 'service.MemberService' that could not be found. ApiController 생성자에 필요한 MemberService 타입의 빈을 찾을 수 없다. 따라서 스프링 빈 or 의존관계 자동 주입의 문제라 파악되어서 일단 어노테이션을 잘 붙여서 스프링 빈으로 잘 등록했는지 확인했지만 이 부분은 멀쩡했었다. MemberService 타입의 클래스를 스프링 빈에 등록할 수 있게 @Service 어노테이션이 붙어있었다. 그렇다면 스프링 빈 자동 등록과 의..