본문 바로가기

전체 글133

[Field-Passer 프로젝트] 쿼리 최적화 (N + 1 문제 해결하기) 뇌 뺴고 코딩 하다가 N + 1 문제가 발생하는 걸 알아차려서 해결하는 방법을 써보겠다. 회원 명단을 가져오는 API를 만들고 있었는데 쿼리를 보니까 N + 1 문제가 발생하고 있는 것을 깨달았다. ================= 1 : 회원 명단 가져오기 ================= Hibernate: select member0_.id as id1_4_, member0_.authority as authorit2_4_, member0_.delete_check as delete_c3_4_, member0_.email as email4_4_, member0_.membername as memberna5_4_, member0_.password as password6_4_, member0_.privilege .. 2023. 2. 4.
[Field-Passer 프로젝트] Spring Data JPA 페이징 처리하기 프론트엔드 쪽에서 회원 목록을 조회하는 API에 대해 한 페이지에 데이터 10개씩 페이징해서 결과를 달라는 요청을 했다. 그래서 처음으로 데이터 페이징 기능 구현한 겸 글을 써본다. 1. Controller @GetMapping("/admin/members") public MemberListVO lookUpMembers(@RequestParam(name = "page") int page) { try { return adminService.lookUpmembers(page); } catch (Exception e) { return MemberListVO.builder() .resultCode(e.getMessage()) .build(); } } 이름을 lookuUpmembers으로 했는데 지금 보니까 이름.. 2023. 2. 3.
[Field-Passer 프로젝트] SpringBoot 로그인 시 예외 처리하기 로그인 기능 구현이 생각보다 시간이 오래 걸렸다. 사실 기능 구현만 하는 건 쉬웠는데 예외처리도 하고 완성도를 높이려다 보니 부가적으로 할 것이 많았다. 처음 구현한 것 public AdminLoginVO adminLogin(AdminLoginRequestDTO admin, HttpSession session) { //회원 존재 확인 if (memberRepository.findAdminByEmail(admin.getEmail()).isPresent()) { Member member = memberRepository.findAdminByEmail(admin.getEmail()).get(); //비밀번호 일치 확인 if (member.getPassword().equals(admin.getPassword().. 2023. 1. 30.
[Field-Passer 프로젝트] Rest API에서 JSON 반환하기 로그인에 성공했을 때 아래와 같은 결과를 JSON으로 넘겨줘야 한다. 밑에 resultData만 넘겨줘야 하는 거면 responceDTO를 만들어서 그대로 반환하겠지만 resultCode도 같이 반환해야 하고 몇몇 형식은 resultData의 개수까지 반환하는 경우가 있기 때문에 어떻게 해야 편하고 쉽게 반환할 수 있을지 고민이었다. 그래서 이번 프로젝트에서는 VO를 사용하기로 했다. AdminLoginResponceDTO @AllArgsConstructor @NoArgsConstructor @Getter @Builder public class AdminLoginResponceDTO { private String email; private String profileImg; private String me.. 2023. 1. 29.
[Field-Passer 프로젝트] JPA 사용해서 Entity 설계하기 야침차게 시작한 사이드 프로젝트 Field-Passer의 개발 첫 삽으로 Entity를 설계해보도록 하겠다. 1. memeber 도메인 - 회원 서비스 1) Member 엔티티 MEMBER 테이블 MEMBER 테이블은 서비스의 근간이 되는 테이블이라고 생각한다. @AllArgsConstructor @NoArgsConstructor @Getter @Builder @Entity @Table(name = "MEMBER") public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ID") private Integer memberId;// ----------> ① @Column(name = "EMAIL") pr.. 2023. 1. 29.
[Field-Passer 프로젝트] 패키지 구조 결정하기 프로젝트를 개발하기에 앞서 패키지 구조를 어떻게 할 지 생각을 해봤다. 1. 계층형 디렉터리 구조 계층형 구조는 각 레이어 별로 디렉토리를 나눈 구조다. 스프링 처음 배울때는 프로젝트를 계층형 구조로 많이 만들었다. 각 계층 별로 클래스도 몇 개 없었기 때문에 충분히 감당할 수 있었기 때문이다. 근데 이번 프로젝트는 그래도 하나의 서비스를 통으로 개발하는 거라 계층형 구조로 하면 한 계층에 클래스가 엄청나게 많이 생길 거 같았다. 그리고 나중에 MSA로 서비스 분리할 때도 힘들 거 같다는 생각이 들었다. 물론 MSA는 그냥 생각만 해본 거다. 2. 도메인형 디렉터리 구조 도메인형 디렉터리 구조는 구현하고자 하는 도메인 별로 디렉토리를 나눈 구조다. 디렉터리 구조만 보고도 도메인이 어떤 것들이 있는지 쉽게.. 2023. 1. 27.