본문 바로가기

분류 전체보기

(193)
21주차 개발일지 이번주는 팀프로젝트를 진행했다. 팀프로젝트의 구현목표는 판매자와 구매자를 매칭하는 마켓으로 정했다. 각각 기능별로 서비스를 나눠서 각자 분업을 했는데, 처음에 계획한것과 많은 변경점이 생기게 되었다. 테스트 도중에 분명 맞는값을 넣어줬는데 동작하지 않아 살펴보니 정해진 대로 만들지 않아 생기는 오류였다. 협업을 하면서 계획을 한대로 구현하는 것이 얼마나 중요한지 알게 되었다. 관리자 기능과 페이징 처리를 구현했었는데, 페이징 처리된 리스트를 페이지로 반환해주는 이유를 알게 되었다. 페이지로 반환하면 반환데이터 안에 페이지의 정보가 있는데, 이 정보를 보고 프론트쪽에서 구현하도록 정보를 보내 주는 것이다. 그런데 페이지의 반환데이터가 제대로 들어가지 않아 고생을 했었는데, pageImpl로 반환할거면 pa..
23년 1월 20일 팀 프로젝트 어제 도전했던 검색기능을 마침내 완성했다. 하다가 포기했던 jpql을 이용했는데, 어제까지는 분명히 잘 되지 않았는데, 오늘 시도해보니 잘 되었다. 어제 시도하다가 착각한게 있었는데, 쿼리를 두번 날리는게 아니라 그냥 조인쿼리를 한번 날리면 되는 것이었다. 그리고, 쿼리를 작성해서 찾아온 값을 어떻게 넣어서 보여줘야하나 고민이었는데, 방법은 간단했다. dto를 하나 만들어서 거기에 담는 형식으로 작성하면 되는 것이었다. 완성된 코드는 이렇다. role이 SELLER인 유저의 키워드를 포함한 닉네임을 불러오는 쿼리이다. order by를 통해 페이징까지 깔끔하게 쿼리를 통해 처리하고 싶었는데, 페이지 정보를 표시하게 하려면 더더욱 복잡한 쿼리를 써야할것같아 그냥 pageable에게 맡겼다. 그리고, 기존에..
23년 1월 19일 팀 프로젝트 검색 기능 구현을 도전해 보았다. 처음에는 스프링의 @Query를 통해 sql쿼리를 직접 보내는 것을 시도해 보았는데, 무엇을 잘못했는지는 모르겠지만, 잘 먹히지 않아 방법을 바꿨다. Jpa에 Containing 이란 것이 있는데, Containing 을 쓰면 입력한 키워드를 포함한 값을 찾는 쿼리, 그러니까 like % 쿼리를 자동으로 날려줘 입력한 파라미터를 포함한 값을 가지고 올 수 있다. 하지만 여기서도 문제가 생겼는데, 내가 가져오고자 하는 값은 profile의 nickname과 user의 username인데, 이러면 두 레파지토리에 모두 접근해, 값을 두번 가져와야 한다. 물론 연관관계를 맺어주면 jpa가 이 모든것을 자동으로 해주기에 깔끔하게 구동시킬 수 있지만, 내가 직접 쓰려니 코드가 너..
23년 01월 18일 팀 프로젝트 시큐리티 처리를 했는데 인가 과정에서 문제가 생겼다. 원인을 한참을 찾았었는데, 이번에도 hasanyRole로 권한을 설정하는 url이 약간 틀려서 그런거였다. 침착하게 코드를 잘 살펴봤어야 했는데, 언제나 그랬듯이 당황해서 여기저기 눌러보는 게 문제인 것 같다. 그리고 페이징을 하면서 생각지도 않은 문제가 있었는데, 페이징을 해서 json을 불러오니 totalpages가 0으로 고정된다. 원인을 찾아보니 이렇게 page를 반환하고 있는데, TotalPages를 지정을 해줘야 했던 거였다. 그래서 코드를 이렇게 썼다. 이랬더니 totalPage가 갱신되었다. Page로 반환을 하는 것을 시도하면서 Page로 반환을 하지 않고 리스트로 반환해도 페이징이 되어 반환이 되는데, 왜 굳이 Page로 처리를 해주..
23년 01월 17일 팀프로젝트 팀프로젝트의 어드민 기능을 완성했다. 처음 계획한 API와 URL이 달라진 부분이 있는데, 구현을 하다 ID참조를 하는게 좋을것 같아 ID를 받게 하는 부분이 있었다. 이 부분은 팀 회의때 팀원들에게 설명하고 적용하게 되었다. 그리고 테스트 코드도 컨트롤러단만 작성을 해 보았는데, 자꾸 illegalstateexception이 떠서 당황했다. 알고보니 @WebMvcTest의 경로를 잘못지정해줘 생겼던 예외였다. 예외메세지를 잘 읽어봤으면 금방 해결했을텐데 당황해서 검색만 해보느라 시간을 좀 쓰게 되었다. 또한 DTO파일들이 정리가 되지 않아 각 기능별로 정리해서 넣었는데, 이에대해 더 좋은 방법을 알게 되었다. 지금 팀프로젝트 클래스들이 CONTROLLER 패키지 에는 모든 기능의 CONTROLLER가 ..
23년 01월 16일 팀프로젝트 팀프로젝트에 대한 계획을 짰다. 프로젝트 목표는 고객과 판매자간 매칭을 한후 거래를 하는 쇼핑몰 만들기이다. 일단 테이블 설계를 위해 먼저 erd를 그렸다. 그다음 api를 작성하고, 그리고나서 uml을 그렸다. entity를 제외하고 나머지는 대략적으로 틀만 잡아놨는데, 프로젝트 코드를 작성하며 변경이 많이 될것같아 빈칸으로 남겨두었다. 그리고나서 대략적인 분업을 했다. 설계를 하며 연관관계에 대해서 의견이 많이 갈렸는데, 결국 연관관계를 일단 최소화하고 진행하기로 했다. 테이블도 처음에는 최종적으로 작성한것과 달리 중구난방으로 많이 작성했었는데, 쓸데없이 중복되는 역할을 하는 테이블과 연관관계를 정리하니 많이 줄어들게 되었다. 저번 프로젝트와 달리 새로 구상을 해야하는 것이여서 난항을 겪었는데, 팀원..
20주차 개발일지 이번주는 예외와 오류의 차이, sql에 대해서 배웠다. 그동안 예외와 오류의 차이를 이해하지 못하고 혼용해서 쓰고 있었는데, 이번기회에 확실히 알게 되었다. 그리고 예외에도 반드시 처리해주어야 하는 예외와 처리를 강제하지 않는 예외가 있다는 것을 알았다. 앞으로는 예외와 오류의 차이, 반드시 처리해주어야 하는 예외와 처리를 강제하지 않는 예외의 차이를 인지하며 처리를 해야겠다고 생각했다. sql은 기존에 배웠던걸 다시 배운다는 생각으로 배웠는데, 제약조건과 인덱스에 대해서 새로 배웠다. 그동안 jpa가 날리는 쿼리가 무슨 소리인지 이해하지 못했는데 제약조건과 인덱스를 배움으로써 이해할 수 있게 되었다. 주말동안에는 테스트 코드에 대해서 공부했다. 새로 프로젝트를 만들면서 테스트 코드도 써보면서 진행하기로..
23년 1월 13일 sql sql의 인덱스에 대해서 학습했다. 각 테이블에는 인덱스를 붙일 수 있는데, 인덱스를 붙이면 균형 트리(balanced tree) 노드가 생성되어 빠른 탐색이 가능하다. 인덱스는 각 열에 붙일 수 있다. 하지만 인덱스를 추가하면 검색 속도가 빨라지는 대신 , 인덱스를 붙인만큼 공간을 더 먹고, 데이터 변경 작업(INSERT, UPDATE, DELETE)이 자주 일어나면 성능이 더 떨어질 수 있다. 인덱스에는 크게 두가지 종류가 있다. 1.자동으로 생성되는 인덱스 1-1.클러스터형 인덱스 어떤 열을 기본 키(Primary key)로 설정하면 자동으로 클러스터형 인덱스가 생성된다. 이 인덱스는 데이터가 정렬 되어 있다. 1-2.보조 인덱스 어떤 열을 고유키(Unique)로 설정하면 자동으로 보조 인덱스가 생..
23년 1월 12일 sql sql의 제약조건에 대해서 학습했다. 테이블을 만들때 pk제약조건을 걸수 있다. create table member ( mem_id char(8) not null primary key, mem_name varchar(10) not null, height tinyint unsigned null ); 혹은 alter와 constraint를 이용해 pk 제약조건을 추가할 수 있다. alter table member add constraint primary key (mem_id); fk제약조건은 다음과 같이 걸 수 있다. create table buy ( num int auto_increment not null primary key, mem_id char(8) not null, prod_name char(6) ..
23년 1월 11일 sql sql문의 join에 대해서 배웠다. join에는 inner join과 outer join이 있는데, inner join은 교집합이 된 부분을 가져오는거고, outer join은 교집합한 부분과, 방향을 지정한 부분의 테이블의 요소를 모두 가지고 온다. 즉, null값도 모두 가지고 올 수 있다. 예를 들면 다음과 같은 쿼리가 있을때, SELECT B.mem_id, M.mem_name, B.prod_name, M.addr FROM buy B JOIN member M ON B.mem_id = M.mem_id; 결과물은 이렇게 나타난다. 교집합 된 부분을 가져오는 것이기 때문에 null값, 즉 값이 없는 부분은 포함하지 않는다. 그리고 outer join을 활용하면, 교집합 된 부분 외에도 테이블의 모든 값..