??? : 나도 해줘
SHH : ???????????
??? : 이슈 내용 정리하게 하나만 만들어줘
SHH : ..... 그래서 그게 먼데?
아니 소문이 이렇게 빠른가 자랑한건 안 비밀
여차저차 내용을 들어보니
문제가 발생하면 엑셀에 정리를 하는데, 품명과 품번을 하나하나 찾아서 적는게 너무 불편하다
품목을 적으면 품번이 세팅되거나, 품번을 입력하면 품명이 세팅되었으면 좋겠다는게 핵심이 였다.
그건 엑셀로도 충분히..
JPA 연습하기에 괜찮아 보여서 시작
Spring Boot Starter 에서 Project 생성
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'
}
ItemInfo
- 매핑에 필요한 TableBoard
- 이슈 기록이 필요한 TableItemInfo
와 Board
는 1:N관계로 설계
@ManyToOne(fetch = FetchType.LAZY)
private ItemInfo itemInfo;
ManyToOne은
N+1문제가 발생할 수 있어서
FetchJoin
으로 한번에 다 가져오기로 결정
@NamedEntityGraph(name = "board.findBy", attributeNodes = @NamedAttributeNode("itemInfo"))
tailwind 과 alpinejs 를 사용해서 화면 및 기능 구현
Issue 리스트 화면
Item 매핑 정보 관리 화면
Isseu 등록 화면
품번과 품명의 입력을 통해 매핑을 고민 중, 입력된 정보로 자동 완성 처리하기로 결정
Input Box에 품번, 품명 상관 없이 조회하여 alplinjs
를 통해 Event
및 View
처리
자동 완성에서 선택을 해야지만 저장이 가능하도록 구현
검색은 위 자동 매핑과 비슷하게 입력을 통한 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());
}
좌측과 우측 끝은 끝 페이지로 이동할 수 있도록 구현
중앙은 현재 페이지에서 +- 2페이지를 보여주도록 구현
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 : 이 시...ㅍ