728x90

분류 전체보기 85

직접 작성해본 쿼리 후기 - (2)

작업기존에 프로그램에서 작성되어있던 코드와 똑같은 결과가 나와야했기 때문에, 최대한 기존 쿼리를 기반으로 엔진에서 매핑해주는 정보만을 추가하는 방식으로 진행해야했다. 그 기존의 쿼리에서 처음엔 이해가 안됐던 코드가 있었는데,SELECT문에 있는 SUBSTR(MAX()~) 구문이었다.SELECT A.NAME , SUBSTR(MAX(A.CODE||A.LABEL), 2, 100) AS LABEL , DECODE(SUM(A.CODE), 2, '베타누락', 1, '알파누락', ' ') AS "누락"FROM (SELECT 2 AS CODE , NAME , ~ FROM ALPA_TABLE UNION ALL SELECT 1 AS CODE ..

SQL/기타 2024.06.25

직접 작성해본 쿼리 후기 - (1)

최근 업무로 조회 쿼리를 직접 작성해볼 일이 생겼다.쿼리를 작성하는 과정에서 겪은 내용과 느낀 점을 정리해보려 한다.  배경한참 오래된 시스템에 신규 기능을 개발할 일이 생겼다. 신규기능이라고는 표현했지만 기능을 만들고,결국에는 그 기능을 직접 사용해서 통계 자료를 추출해 제공해야 하는 상황이었다.(프로젝트 사정 상 어쩔 수가 없는 상황.)  기존 프로그램에 기능을 신규 개발하여 테스트를 진행한 결과 1건당 대략 3~4시간씩 소요됐는데,총 252건의 작업이 필요했기 때문에 어마어마한 시간 투자가 예상됐다. 데이터 양 자체가 많은 편은 아니었지만,해당 프로그램에 들어가는 엔진에서 자체적으로 매핑해주는 데이터들이 통계자료의 핵심이었고엔진에서 매핑해주는 값들을 추출해내기 위해 값 하나하나마다 쿼리를 반복해서 ..

SQL/기타 2024.06.21

JPA 환경에서 메시지 체인 리팩토링 시 주의점

메시지 체인?레퍼런스를 따라 계속해서 메서드 호출이 이어지는 형태를 말한다. 코드로 보자면product.getUser().getId()  와 같은 형태이다. 흔히 '냄새나는 코드' 라는 이름으로 리팩토링 대상이 되는 구문이다. 리팩토링 방법주로 '캡슐화'를 통해 해결한다. 클래스 내부에 해당 메서드 체인을 숨겨서, 외부에서는 product 클래스만으로 해당 상품의 userId를 알 수 있도록 하는 것이다. public class Product{ private User user; //etc public Long getUserId(){ return this.user.getId(); }} 위와 같이 Product 내부에 user.getId()를 숨겨서, 외부에서는 product.getUs..

케이뱅크 장기미사용 거래제한 세션 만료로 해제 실패..?

얼마전 시행된 K-패스에 등록할 교통카드를 하나 만드려고 찾다보니 가능한 체크카드 중에 케이뱅크가 있었다.케이뱅크에서 체크카드를 한 번 만들어보려다 생긴 이슈를 UX관점에서  관련 정보와 함께 정리해본다.  K-패스 공식홈페이지https://korea-pass.kr K-패스K-패스 홈페이지korea-pass.kr  K-패스?2024년 5월부터 시행된 사업이고, 버스나 지하철 등 대중교통 이용 금액 중 일부를 적립(환급)해준다.대중교통을 이용해 출, 퇴근한다는 사람이라면 꼭 챙겨볼만 한 혜택이다.이전에도 있었던 알뜰교통카드 제도가 종료되면서, 대체제로 나온 것 같다.자세한 사업 내용은 위에 링크된 공식 페이지에서 확인하는 게 더 좋을 듯. 적용 카드? K-패스를 사용하기 위해 카드를 알아보니, 카드가 전용..

잡담 2024.05.18

쿠팡 앱 기능의 UI/UX에 대한 이야기

최근에 지인분이 쿠팡의 '자주 산 상품' 삭제 기능에 대한 토픽을 던져주셔서 해당 기능에 대해 같이 살펴보면서 이야기하다가 재밌는 점이 있어서 공유해보려고 한다. 기능 설명쿠팡 앱 '자주 산 상품' 탭에서 해당 상품 메뉴를 누르면 자주 산 상품에 더이상 뜨지 않도록 삭제하는 기능이 있다.  이 삭제 버튼을 누르면 화면에서는 '자주 산 상품을 삭제했습니다.' 라는 문구가 표시되며, 실행취소를 누를 경우 원래대로 돌아온다.  같은 페이지에서 여러 상품을 자유롭게 삭제했다가 실행취소할 수 있다. 이후 뒤로 가기를 누르거나, 홈으로 가게 되면 최종적으로 삭제한 아이템들이 목록에서 더 이상 보이지 않게 된다. 논지처음에 했던 이야기는 삭제 버튼을 눌렀을 때 바로 목록이 갱신되며 해당 상품이 사라져버리는게 아닌 '..

잡담 2024.05.01

JPA-EmbeddidId, 복합 키에 대한 이야기

프로젝트 코드 작성 중 EmbeddidId와 관련한 고려사항을 정리해보았다. 구현 목표 매일 자정을 기준으로 랜덤하게 갱신되는 Shop에서, 특정 수량을 구매하는 기능 구현 설계 Shop : 매일 랜덤한 아이템 리스트와 수량이 업데이트된다. (자정 기준) 구매하지 않더라도 시간이 지나면 목록에서 사라짐(ex. 로스트아크 떠돌이 상인) User : Shop에 갱신되는 목록 중 일부 아이템, 일부 수량을 구매할 수 있다(최대 수량 이하). Purchase : User의 Shop 구매 목록(중간테이블 역할) 작업내용 이전부터 Entity를 설계할 땐, 관계 설정 시 항상 비식별 관계로 참조되는 형태로 구성했다. @Entity public class Purchase { @Id @GeneratedValue(str..

JPA - findById

3월달 업무 목표를 좀 일찍 끝내서, 오랜만에 개인 프로젝트 코드를 조금 작성해보았다. 업무에서 JSP, MyBatis 등을 다루다가 캠프에서 사용했었던 SpringBoot와 JPA를 오랜만에 사용해보니 감회가 새롭다. JpaRepository 캠프에서는 MVC패턴으로 프로젝트를 작성할 때, JpaRepository를 extends한 repository interface를 만들어서 사용했었다. @Repository public interface UserRepository extends JpaRepository { Optional findByLoginId(String loginId); Optional findByUserId(Long userId); } 이런 식으로 findBy@@(조건) 이라는 메서드를 i..

SQLP 관련 도서 3종 (feat. 교보문고 신세계상품권 사용, 할인)

SQLD 시험이 끝나고 하반기 SQLP시험을 준비하기 위해서, 교보문고에서 신세계상품권으로 SQLP 관련 책을 구매한 후기와 할인받은 방법에 대해서 포스팅해본다. 교보문고 신세계상품권 사용?얼마 전 신세계상품권 10만원권이 생겼는데, 어짜피 SQLP 준비하려면 관련 책을 사야했던 상황이라 상품권으로 책을 살 수도 있나? 싶어서 찾아보게 되었다. 교보문고는 신세계 계열사도 아니어서 사용이 될까 싶었는데, 신세계 홈페이지 상품권 이용안내 탭에서 영풍문고, 교보문고에서 상품권 사용이 가능하다는 것을 찾을 수 있었다. 할인일반적으로 책을 더 싸게 사는 방법으로 많이 알려진 내용은 G마켓, 옥션등과 같은 오픈마켓에서 책을 사는 것이다. 이번에 구매한 3개 책을 검색해보면, 책 가격 자체도 정가에서 할인해주는 경우..

구입기/도서 2024.03.10

2024 제52회 SQLD 시험 후기

2024년부터 범위 및 시험형식이 개정된 후에 진행되었던 첫 SQLD 시험 후기를 짧게 적어본다. 난이도?이전에는 자격증에 대해 몰랐고, 올해 들어 한 달 정도 급하게 준비한 첫 시험이어서 작년 대비 난이도 변화를 직접적으로 체감할 수는 없었다. 시험 문제를 풀면서, 문득 시험 준비중에 SQLD 자격검정 실전문제를 풀던 때가 떠올랐다.https://hae3043.tistory.com/81 SQL자격검정 실전문제(2023년 개정)2024년부터 SQLD 자격증의 시험 범위가 다소 변경되어서, 그에 맞춰 개정된 문제가 필요하지 않을까 싶어 개정판이 나오자마자 구매해서 SQLD범위까지 1회독 한 후의 후기를 올려본다. 2024년 SQLD 범hae3043.tistory.com 해당 책은 시험 주관사에서 직접 출판..

SQL/기타 2024.03.09

xls <-> csv 변환기 - 3

다른 업무 처리하느라 신경쓰지 못했던 코드를 조금 손보았다. Covnerter 인터페이스 활용하여 중복 코드 제거 프로젝트에서는 엑셀->csv 와 csv->엑셀 변환 메서드를 가진 class가 분리되어 있다. 초기 설계 시 각각을 Converter라는 인터페이스를 상속받은 구현체로 선언해놓긴 했지만, 막상 로직에서는 객체지향의 장점을 살리지 못하고 각각 메서드 자체를 분리한 후 사용자로부터 작업 번호를 받아 switch문을 통해 필요한 메서드가 호출되도록 작성했었다. public void work(int num){ try { switch(num) { case 1 : csvToExcel(); break; case 2 : excelToCsv(); break; case 0 : exit(); break; //T..

728x90