728x90

프로젝트 9

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..

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..

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..

xls <-> csv 변환기 - 2

앞의 글에서 말했듯이 만드는 동안 추가적으로 고려해야 할 점이 있었다. 일단 첫 번째로 인코딩을 어떻게 할지 였는데, 일단 인코딩에 대해 보기 편하게 정리된 Tistory들이 많아서 관련 내용을 참조하였다. https://onlywis.tistory.com/2 문자열 인코딩 개념 정리(ASCII/ANSI/EUC-KR/CP949/UTF-8/UNICODE) 지금껏 개발을 해오면서 ASCII와 ANSI의 차이에 대해 깊게 생각해 본 적이 없었다.UTF-8 기본으로 하여 개발을 해왔던 이유도 있거니와ASCII=ANSI로 생각해도 사실 큰 문제는 없어왔다. 점 하나 그냥 찍 onlywis.tistory.com https://it-eldorado.tistory.com/61 [문자열 인코딩] ASCII, ANSI, ..

xls <-> csv 변환기 - 1

우선 excel에서 값을 읽어오는 것 자체는 apache의 poi 라이브러리로 가능하고, 방법도 그리 어렵지 않으니 설명은 생략하고 만드는 과정에서의 고려사항과 트러블 슈팅을 위주로 기술하려 한다. 일단 변환을 구현하기 위해 csv가 뭔지, 어떤 식으로 변환되는 건지 알아야했다. csv는 comma separated value의 약자로, 콤마(,)로 값이 분리되는 파일 형식이다. 엑셀에서 이런 값이 있다고 하면, csv로 변환할 경우 이렇게 변환되는 것이다. 딱 저기까지 알고 코드를 짜려고 보니 바로 첫 번째 난관에 봉착했다. '그럼 엑셀 값에 콤마(,)가 들어있으면 어떻게 되는데?' 거두절미하고 excel 자체 기능을 통해 실험해보았다. 이렇게 넣고 excel에서 .csv 로 다른이름 저장 후 메모장으..

xls <-> csv 변환기 - 0

기본적으로 엑셀 파일과 csv 방식 파일은 Office Excel내에서 다른 이름으로 저장 기능을 통해 양방향 변환이 가능하다. 회사 업무 중 다량의 파일을 변환할 일이 생겼는데, 파일을 하나하나 변환하자니 좀 불편했다. 그렇다고 웹에 올라와있는 온라인 툴을 쓰자니 변환할 자료의 성격 상 외부로 노출시킬 가능성이 생기면 곤란했다. 조금 더 편하게 하는 방법이 없을까 고민하다가 결국 Java와 apache.poi 라이브러리를 사용해 직접 변환하는 코드를 만들었다. 서비스 배포를 목적으로 하는 프로젝트는 아니지만 코드를 짜면서 겪었던 것들을 정리하고, 최종적으로 부끄럽지 않을 정도로 수정한 후 소스를 공유해야겠다. 취업을 위한 포트폴리오를 목적으로 하는 게 아닌 실질적인 필요에 의해 무언가를 만들어내는 사실..

아이디 중복 검사

아이디 중복 검사 API요청 로직을 구현하던 중, 처음엔 별 생각없이 isDuplicated 라는 Boolean타입으로 중복일 경우 true, 중복이 아닐 경우 false로 반환하도록 작성하였다. 단순히 논리적인 관점에서만 봤을 때 isDuplicated라는 이름으로 true, false를 반환하는 것은 나름대로 직관적인 것처럼 보인다. 그런데 프론트단의 코드를 짜려고 보니 중복 확인을 한 결과가 true이면 생성이 불가능함을 안내해야 하는 상황에 뭔가 불편함이 느껴졌다. 물론 프론트에서도 변수명을 isDuplicated라는 이름으로 나타낸다면 제3자가 보고 해석하는 데 문제는 없겠지만, true인데 불가능함을 나타내는 것이 불가피한 상황이 아니라면 이렇게 작성하는 것이 옳은가에 대한 생각을 하게 되었다..

728x90