살려줘 시리즈 2

S_H_H·2022년 9월 25일
0

집사 도움!

목록 보기
2/3
??? : 나도 해줘
SHH : ???????????
??? : 이슈 내용 정리하게 하나만 만들어줘
SHH : ..... 그래서 그게 먼데?

아니 소문이 이렇게 빠른가 자랑한건 안 비밀

여차저차 내용을 들어보니
img

문제가 발생하면 엑셀에 정리를 하는데, 품명과 품번을 하나하나 찾아서 적는게 너무 불편하다

품목을 적으면 품번이 세팅되거나, 품번을 입력하면 품명이 세팅되었으면 좋겠다는게 핵심이 였다.



그건 엑셀로도 충분히..
JPA 연습하기에 괜찮아 보여서 시작


Project 생성

Spring Boot Starter 에서 Project 생성

  • Gradle Project
  • Spring Boot 2.7.4
  • JAVA 8
  • Database - H2
  • JPA
  • thymeleaf
  • lombok
  • apache.poi
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-cache'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-data-redis'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
	implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3'
	implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '5.2.3'
	implementation group: 'org.springframework.boot', name: 'spring-boot-maven-plugin', version: '2.7.3'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.h2database:h2'
	runtimeOnly 'mysql:mysql-connector-java'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

Domain 설계

diagram

  • ItemInfo - 매핑에 필요한 Table
  • Board - 이슈 기록이 필요한 Table

ItemInfoBoard는 1:N관계로 설계

@ManyToOne(fetch = FetchType.LAZY)
private ItemInfo itemInfo;

ManyToOne은 N+1문제가 발생할 수 있어서
FetchJoin으로 한번에 다 가져오기로 결정

@NamedEntityGraph(name = "board.findBy", attributeNodes = @NamedAttributeNode("itemInfo"))

화면 및 기능 설계

tailwindalpinejs 를 사용해서 화면 및 기능 구현

  • Issue 리스트 화면

    • 검색 기능
    • Excel Export
    • 수정, 삭제 기능
    • 페이징
  • Item 매핑 정보 관리 화면

    • 검색 기능
    • 등록 및 수정 처리
  • Isseu 등록 화면

    • 자동 완성
    • 등록 및 수정

기능 구현

자동 완성 처리

품번과 품명의 입력을 통해 매핑을 고민 중, 입력된 정보로 자동 완성 처리하기로 결정
Input Box에 품번, 품명 상관 없이 조회하여 alplinjs를 통해 EventView 처리
Auto Comple

자동 완성에서 선택을 해야지만 저장이 가능하도록 구현

검색 및 페이징 처리

검색은 위 자동 매핑과 비슷하게 입력을 통한 Event로 조회 처리
QueryDSL을 사용하는게 아니여서, 조회 필드에 따른 메소드 명이 엄청 길어졌다

@EntityGraph("board.findBy")
List<Board> findByItemInfoItemNameContainingOrItemInfoItemCodeContainingOrIssueContaining(String name, String code, String issue, Pageable of);

페이징JpaRepository 를 상속받아 사용 중으로 Pageable을 사용
size, sort는 고정값으로 해버림 절대 귀찮아서가 아님 암틈 아님

private int size = 10;

public Pageable of() {
    return PageRequest.of(this.pageNumber, size, Sort.by("id").descending());
}

Paging

좌측과 우측 끝은 끝 페이지로 이동할 수 있도록 구현
중앙은 현재 페이지에서 +- 2페이지를 보여주도록 구현

  • 1페이지인경우 +4 처리 마지막 페이지인경우 -4 처리
int endIndex = this.pageNumber+3;
int startIndex = this.pageNumber -2;
startIndex = this.totalPages - this.pageNumber == 2 ? startIndex - 1 : startIndex;
startIndex = this.totalPages - this.pageNumber == 1 ? startIndex - 2 : startIndex;
for(int i = startIndex; i < endIndex; i++){
      if(i >= 0 && i < this.totalPages){
          this.pages.add(i);
      }else if(i < this.totalPages){
          endIndex++;
      }
}

나머지 기능에 대해서는 기본적인 CRUD라서 생략
Excel Export는 살려줘 시즌 1은 참고하시면 됩니다.
코드에 대해서는 git에서 확인해주시면 됩니다.


마무리

.jar ,H2 설치 파일 그리고 실행시킬 .bat 파일을 전달
다행이 문제 없이 실행이 되구, 잘 쓰고 있는거 같아 다행 휴...

여담

alpinejs 에서 enter 이벤트는 제바아알 form 테크 안에서 하지마세요 몇 시간 날려먹음
intellij에서는 문제없었는데 jar파일로 실행 후 classpath를 못 찾는 문제 발생 몇 시간 날려먹음

yml에 설정을 잡은 상태로 개발을 하구, jar 파일에서는 못찾음
모든 경우에 수를 변경해봤지만 실패, 결국 설정 자체를 지워버리니 잘되드라
spring.thymeleaf.prefix: file:src/main/resources/templates/

JPA 보다는 화면 구성과 이벤트 처리에 많은 시간이 들어갔다.. CSS 진짜 내 맘처럼 안되네






SHH : 만족함?
??? : 너무 좋은데???
SHH : 뿌듯 ㅎㅎㅎㅎ 근데 한달에 이슈 몇개 적어??
??? : 유동적인데, 한달에 1개 적을때도 안적을때도??
SHH : 이 시...ㅍ


profile
LEVEL UP

0개의 댓글