Mybatis 관련 예제를 작성하던 중 class 이름을 변경해야하는 일이 있었습니다. 저는 익숙하게 인텔리제이의 기능을 활용하여 (Shift + F6) 클래스를 수정했는데.. 관련 클래스가 어디엔가 String 타입으로 선언되어 있다면.. 해당 클래스 이름도 바꿀지 말지에 대한 창이 나옵니다. 무심코 아니요를 눌렀고.. 테스트 코드를 돌렸더니 아래와 같은 에러메시지가 나왔다. Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias 'co m.xxx.xxx.XXXApplication.Test'. Cause: java.lang.ClassNotFoundException: Cannot find class: co m.xxx.xx..
안녕하세요. 오늘은 MyBatis에서 여러건의 Record를 삽입하기 위해서 쓸 수 있는 태그에 대해 공유하고자 합니다. 우선 insert 쿼리문을 보면 INSERT INTO ROOM(type, deal_type, status) VALUES ('원룸', '월세', '광고중'); 이런 형태로 native 쿼리를 작성해야 할텐데요. JPA 처럼 saveAll() 기능을 제공하게 된다면 매우 편하게 삽입작업을 할 수 있겠지만 MyBatis는 쿼리문을 직접 작성하기 때문에 List의 갯수만큼 insert mapper를 호출하거나 해야했을 것입니다.(이렇게 썻다면 정말 안타까운 상황이네요ㅠㅠ) 예컨데 v1 public class Service { public void addRoom(String type, Stri..
native 쿼리를 직접 작성하는 JDBCTemplate이나 MyBatis 같은 기술은 항상 쿼리문을 직접 관리해야한다는 안좋은 단점이 있다. 물론 특정 DBMS에 맞는 native Query를 직접 작성하는 이점으로 각 쿼리마다 최적화할 수 있다는 장점이 있지만 한두개정도이지 임계점이 넘어가게되면 부담이 될 수밖에 없다. 그 중에서 중복으로 사용되는 조건이나 복잡한 다이나믹 쿼리 조건이 여러 쿼리에서 동시에 사용해야될 경우 xml 쿼리 파일의 용량은 그 배수만큼 커질 것이다. (예를 들어, 페이징의 경우 where절 로직은 메인 Select 문과 count 문의 조건이 limit offset을 제외하고 동일해야한다.) 뭐 예를 들면, 아래와 같다. 다방에서 매물 목록을 조회하는 페이징 API를 호출한다..
안녕하세요. 오늘은 MyBatis를 활용하던 도중 발생했던 에러에 대해서 공유하고자 합니다. 먼저 발생한 Exception은 postgresql 쪽에서 PSQLException으로 던지고 MyBatis 에 의해 Exception이 Wrapping 되어 가장 가까운 Exception은 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: 이런 메시지로 노출되게 됩니다. cause를 쫓아 가게되면 결국 PSQLException으로 Caused by: org.postgresql.util.PSQLException: Th..
오브젝트 컨버터로 Mapstruct 라이브러리를 활용하는 중에 보통 컴파일 실패시 어떤 추상 메소드에서 어떤 매핑에 실패했는지에 대해서 알려준다. 하지만 어떤 원인인지는 모르겠지만 maven을 활용하면서 굉장히 raw한 에러메시지를 만났고 전혀 어떤 원인에 의한 에러인지 확인할 길이 없었다. 컴파일 에러면 보통 컴파일러가 어느 지점에서 어떤 정확한 사유때문에 컴파일 할 수 없다고 알려주게 되는게 보통 나의 경험이었는데.. 오류를 해결하기가 매우 까다로웠다. 그때, 아래의 스택오버플로우를 발견하여 해결했다. 우선 에러메시지는 아래 참조페이지에서 본것과 마찬가지로 빌드 실패하며 stack을 띄우는데 "C:\Program Files\Java\jdk-14\bin\java.exe" -Dmaven.multiModu..
예전에 받았던 질문중에서 "MyBatis를 쓰고 실행 계획에 기반한 쿼리 튜닝을 통해서 성능을 많이 향상시킨다고 하셨는데, 랜덤 엑세스에 대해서 아시나요?" 라는 질문이 있었다. 랜덤 엑세스?? 분명 내가 보던 실행 계획에는 그런 워딩은 없었던 것 같다. 단순히 slow를 유발하는 컬럼에 대해 인덱스를 생성하고 해당 컬럼에 대한 쿼리 플랜에 index scan이 일어나는 것을 확인하고 쿼리의 실행 속도정도만 확인했었다. 나는 확실히 where 절에 활용되는 컬럼만을 집중했었다. 랜덤엑세스 랜덤 엑세스란 데이터를 저장하는 블록을 한번에 여러 개 액세스하는 것이 아니라 한 번에 하나의 블록만을 액세스하는 방식이다. 한 번에 여러 개의 블록을 액세스한다면(랜덤 엑세스와 반대) 같은 양의 데이터에 대해 적은 횟..
안녕하세요. 최근에 기업의 개발자에 대한 수요가 많아지고 언론에 의해 개발자의 높아져가는 연봉에 대한 이슈가 많아지니 코딩 학원들과 교육과정들이 많이 생겨났음을 실감하고 있습니다. 그리고 저도 프로그래머스 데브코스에서 신입 개발자가 되고 싶은 취준생들과 함께 하고 있는데요! 정말 많은 사람들이 개발자라는 직업에 대해 흥미를 갖고 구직을 하고 있는 걸로 보여집니다. 저 또한 몇년전에는 이러한 구직자중 하나였는데요! 그때의 저를 회상하며 캐치 커리어콘에서 신입 개발자 취업준비생을 위한 연사를 진행하게 되었습니다. https://www.catch.co.kr/CatchClass/CareerCon 캐치 커리어 콘ㅣ캐치 캐치 커리어 콘은 구직시장에서 꼭 알아야할 HOT 키워드를 선정하여 캐치의 인사이트를 전달하는 ..
안녕하세요. 회사에서 단순 API 개발 업무를 하다가 동시성 이슈를 맞딱뜨리게 되었고, 동시성 처리에 대해 알아보던중, 병럴(parallel)이라는 키워드를 종종 보곤하여(ex, parallelstream) 두가지 개념에 대해서 정리하고자 합니다. 우선 두가지를 직관적인 표로 비교해서 보겠습니다. 동시성(Concurrency) 병렬성(Parallelism) 여러 작업이 동시에 실행되고 있는 것처럼 구현되는 것 여러 작업이 실제로 동시에 실행되고 있는 것 싱글 코어 환경에서 단일 프로세스 내에 멀티 스레드를 동작하여 구현 멀티 코어 환경에서 멀티 프로세스(단일 스레드) 혹은 멀티 스레드를 활용하여 처리. 빠른 시간에 하나씩 많은 것을 처리 한번에 많은 것을 처리 논리적인 부분 물리적인 부분 예시) 커피 추..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.