본문 바로가기

SQL15

[Mybatis] entity mapping to camel case User 테이블에 있는 정보를 User 객체에 매핑하는 쿼리를 아래와 같이 짰다. SELECT user_id AS user_id , user_name AS user_name , tel AS tel , email AS email FROM users WHERE user_id = 'hajs' 근데 어째서 연락처랑 이메일만 가져오게 된걸까? 이유는 mybatis alias 을 snake-case 로 작성했기 때문이다. 그렇기 때문에 application.yml 또는 application.properties 에 아래와 같이 camel-case 로 매핑될 수 있도록 설정을 추가하자 :) mybatis.configuration.map-underscore-to-camel-case=true yml 로 작성하시는 경우엔 .. 2021. 7. 13.
[JPA] JPA 특징 (동일성 보장, 쓰기 지연, 변경 감지, 그리고...) 이번에는 JPA 의 특징으로 많이 거론되는 3대장에 대해서 정리해보고자 합니다. 👥 사실 이 3대장은 영속성 컨텍스트의 동작 방식에서 나온 특징이라는 점 참고 부탁드립니다. 영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 뜻합니다. 동일성 보장 동일성 보장은 EntityManager 에서 한 객체에 대해 여러 번 꺼내도 꺼낸 객체들은 모두 같다(`==`) 는 것을 보장해줍니다. 이게 어떻게 가능할까요? 영속성 컨텍스트 안에 있는 1차 캐시에서 Transaction Isolation Level 을 level2 (반복 가능한 읽기, REPEATABLE_READ) 수준을 사용하기 때문에 데이터베이스가 아닌 애플리케이션 차원에서 보장해줄 수 있는 것 입니다. public static void main(Strin.. 2021. 7. 1.
[MySQL] Delete 쿼리 Syntax Error (delete query in subquery) MySQL 로 DELETE 쿼리를 날리는데 아래 에러가 발생했다. SQL Error [1093] [HY000]: You can't specify target table 'my_table_key' for update in FROM clause 음??????? 내가 아는 delete 문법에 어긋나지 않은 것 같은데...??? 하던 중 stackoverflow 에서 나와 같은 문제에 직면한 사람을 만났고, subquery 를 아래처럼 사용해야 한다고 답변을 받았다. (왤까? 이건 찾아봐야겠다.) -- error DELETE FROM my_table WHERE my_table_key IN ( SELECT jt.join_table_key FROM join_table jt RIGHT JOIN my_table mt .. 2021. 3. 19.
[MySQL] 대용량 데이터 select 시 limit 사용 주의점 대용량 데이터를 RDB 로 관리하던 중, 아래와 같이 limit offset 을 사용하며 select 할 때 문제가 있었다. -- 0부터 시작하는 offset 은 빨랐지만 SELECT * FROM my_table LIMIT 0, 5000; -- offset 이 높을수록 성능이 저하가 되었다. (속도 느림) SELECT * FROM my_table LIMIT 1000000, 5000; 조금만 구글링해도 나오는 원인이었는데.. 단순 LIMIT 는 인덱스를 타지 않아서 두번째 쿼리 같은 경우는 100만번까지 쿼리를 읽고 거기에서 5천개를 가져오는거라서 느릴 수 밖에 없었다. 그에 따른 해결방법은 아래와 같았음을 기록.. -- #1. SELECT * FROM my_table WHERE my_table_pk BE.. 2020. 12. 22.
[Mybatis] update 문 parametertype 을 map 으로 받아 foreach 처리하는 방법 서비스를 하다가, 모든 유저의 이름을 '홍길동' 으로 바꿔야 할때. 그 객체를 Map 으로 가지고 있는 경우에 대해 포스팅하겠습니다. (위에서 언급한 '그' Map 객체) // Map 구조 (id:userName} 'hajs' = {'홍길동'}, 'user01' = {'홍길동'}, 'user02' = {'홍길동'}; 우선 Mapper 에서 param 을 Map 으로 전달해주고, void updateUserName(@param("userNameMap") Map userNameMap); xml 에서는 (아래처럼) update 문에 foreach 돌리면서 처리하면 된다. UPDATE user SET user_name = CASE WHEN user_id = #{userId} THEN #{user_name} EN.. 2020. 5. 18.
[MyBatis] PK가 없으면 INSERT, 있으면 UPDATE -> LIST 로 처리하기 개발자라면 한 번 쯤은 들어봤을.. 있으면 INSERT, 없으면 UPDATE .. Model 을 하나씩 받아서 처리하면 더할나위 없이 좋겠지만, Model 을 List 로 받아서 처리해야 될 때도 있다. 여기까진 단순하게 조금만 구글링하면 나온다. // in mapper void insertUserInfo(@Param("userInfoList") List userInfoList); // in xml INSERT INTO user_info ( user_no, user_id, user_name ) VALUES ( #{userNo}, #{userId}, #{userName} ) 근데 이제 여기서 userNo(PK라고 가정하자) 가 없으면 INSERT, 있으면 UPDATE 해야 된다면 ?? // in xml I.. 2020. 4. 2.