ToyProject 1. 만화책 대여 시스템

주8·2023년 2월 1일
0
post-thumbnail

기간
2023/1/19 ~ 2023/1/30

개요
자바로 만화책 대여 시스템을 제작하는 프로젝트(커맨드 라인으로 입/출력)


스프링 경험도 있고, 커맨드로만 입출력하는 거라 쉽겠다고 생각했음. 하지만 그건은 경기도 오산...

아무튼 쉽고 재밌겠다, 시간도 넉넉하겠다 싶어서 설 연휴 때 펑펑 놀고(ㅋㅋ...) 마지막 주말에 시작함 ㅋㅋㅋ 그래서 사실상 28,29,30로 3일동안 했는데......

네... 진짜...... 와... 시간을 돌리고 싶다...

쉽고 x 재밌고 XXX

오히려 스프링 없이, 데이터베이스 없이(!!!) 자바로만 구현하는 게 진짜... 오히려 제약이 됐다ㅜㅜ 진심 스프링하고 싶고 JPA는 고사하고 하다못해 데이터베이스 쿼리 쓰고 싶었음.....
특히 데이터베이스 대신 Array에 값을 입출력해야 하는 게 진짜 힘듦ㅜㅜ 생각없이 ArrayList로 썼다가 출력해야 할 때 id값을 어떻게 구하지;; -> 다시 코드짜기의 무한 반복ㅋㅋㅋ 결국 HashMap으로 전부 바꾸고(그마저도 id값도 직접 넣어야 해서 .lastEntry() 쓰고 싶어서 TreeMap으로 다시 바꿈ㅋㅋㅋ)

그리고 트랜잭션 락이 없으니까ㅜㅜ Exception 에러를 throw해도 다른 코드 실행 됨 ㅎㅎ... 그래서 if else문 떡칠 ㅎㅎ......

Entity 계획도 스프링에서 하던 것처럼 만들었는데 생각해보니까 N:1 어떻게 함?ㅋㅋㅋㅋㅋ oneToMany고 나발이고 ㅋㅋㅋ 그래서 또 수정수정... FK 개념이 없으니까 그냥 HashMap의 key값을 참조해야 하는 객체의 key값으로 넣고... 아무튼...... 코드 드러워지고... 복잡해지고... 시간 촉박해서 정신 나가서 자잘한 실수 반복하고... 눈도 침침해져서(ㅋㅋㅋ) 파일도 못 찾고... 암튼 참... 기간이 넉넉한 데엔 이유가 있는 것을...

너무 날 과대평가했나 나도 모르게?...

처음엔 주어진 조건보다 더 디테일하게 만들어야지~ 하고 신났는데 막상 코드 짜다보니까 주어진 것도 다 할 수 있을까 싶었음 ㅋㅋ... 아니 왜 이런 시련을......

암튼 거두절미하고 본론으로 들어가면

Tree

.
├── Main.java
├── app
│   └── ComicsRentalApp.java
├── comm
│   ├── Menu.java
│   ├── Table.java
│   ├── Validate.java
│   └── exception
│       ├── GlobalExceptionHandler.java
│       ├── NotFoundException.java
│       ├── UnworkableException.java
│       └── WrongNumberException.java
├── controller
│   ├── ComicsController.java
│   ├── ComicsControllerImpl.java
│   ├── Controller.java
│   ├── CustomerController.java
│   ├── CustomerControllerImpl.java
│   ├── RentalController.java
│   └── RentalControllerImpl.java
├── domain
│   ├── Comics.java
│   ├── Customer.java
│   ├── Entity.java
│   ├── Rental.java
│   └── RentalItems.java
├── dto
│   ├── ComicsDTO.java
│   ├── CustomerDTO.java
│   ├── DTO.java
│   └── RentalDTO.java
├── factory
│   ├── Factory.java
│   └── Switch.java
└── repository
    ├── ComicsRepository.java
    ├── ComicsRepositoryImpl.java
    ├── CustomerRepository.java
    ├── CustomerRepositoryImpl.java
    ├── DB.java
    ├── RentalRepository.java
    ├── RentalRepositoryImpl.java
    └── Repository.java

회고

domain은 안 만들고 dto만 써도 됐지만... 그냥 entity를 따로 두고 싶었다... dto로 사용자 값만 받아서 entity 타입으로 repository에 저장하는 걸로 만들었고
factory에서 controller나 repository를 enum으로 구분해서 각각 맞는 객체를 보내줬고... 사실 repository나 controller도 만들고 보니 중복되는 코드가 많았어서 ㅎㅎ 상위 클래스로 만들고 하위클래스를 개별로 만들어서 넘기거나... 통합하는 방향으로 짰으면 좋았을텐데 맘이 급해서 거기까지 머리가 따라가지 못했다 ㅋㅋ...
Rental도 Comics, Customer과 oneToMany, ManyToOne 관계를 생각해서 RentalItems 객체를 따로 만들어서 각각 객체를 멤버변수로 뒀는데... 생각해보니까 어짜피 JPA 쓰는 것도 아니고 ㅋㅋ 참조가 안 될텐데 싶었는데 이미 만든 거 또 엎기 힘들어서 그냥 Rental의 id를 CustomerId 값으로 하고(어짜피 시스템 기획상 1명의 고객은 1건의 대여만 발생함) RentalItems의 id는 ComicsId로 했다.

암튼 여차저차 구현은 했는데 아쉬움이 많이 남고 ㅎㅎ...
아니 무엇보다 view 구현하기가 힘들었다ㅜㅜ 메뉴 넘어가고 메소드 호출하고하는 게 헷갈려서...
view를 하나에서 만든 게 아니라 나눠서 구현해가지고...

+강사님이 만드신 코드를 보여주셨는데 와... 진짜...ㅋㅋㅋ
나 뭐했나 싶음ㅋㅋㅋ 람다... 스트림... 진짜 공부해야겠다는 생각을 했다...
다른 걸 떠나서 view에서 구현하는 메뉴도 중복되는 건 변수로 선언해서 재사용하니까 코드가 진짜 깔끔해지는구나 나는 아직 한참 멀었구나 싶었다ㅜㅜ 코드의 재사용성을 높이고, 멤버변수도 spring의 autowired 생각하고 무지성하게 controller며 repository며 static 멤버변수로 썼는데 그렇게 되면 GC의 영향을 받지 않아서 프로그램 종료될 때까지 사용하지 않는 데이터가 쌓인다는 지적이ㅜㅜ 아 맞네;; 하고 바로 각 메소드에서 필요할 때마다 호출해서 쓰도록 급 수정......ㅎ

profile
웹퍼블리셔의 백엔드 개발자 도전기

0개의 댓글