본문 바로가기
  • Where there is a will there is a way.

개발85

객체 지향 설계 5단계 무엇을 개발해야 하는지 명확하게 이해하지 못한 상태에서 코딩부터 시작하는 개발자는 회사의 입장에서 시간과 돈을 낭비하게 만들며 더 심각한 문제를 만들 수 있다. 1단계 모호성의 해소 ( 비즈니스 파악 ) 객체 지향 설계는 우선 누가 그것을 사용할 것이며 어떻게 사용할 것인지 파악하는 것이 중요하다. 2단계 핵심 객체의 설계 ( 모델 설계 ) 핵심 객체가 무엇인지 생각해봐야 한다. 예를 들어, 식당을 객체 지향적으로 설계한다고 하면 Table, Guest, Party, Order, Meal, Employee, Server, Host 등이 있을 수 있겠다. 3단계 관계 분석 ( 모델 관계 설정 ) 어떤 객체에 속해 있는가? 다른 객체로부터 상속 받아야 하는 객체는 있나? 다대다 인가 일대다 인가? 4단계 행.. 2020. 3. 26.
Java Collection 프레임워크 자바 collection 프레임워크 배열은 크기가 고정되어 있고 객체를 삭제했을 대 해당 인덱스가 비고 새로운 객체를 저장할 때 어디가 비는지 확인해야하는 과정들을 거쳐야 하는 경우가 있다. 자바는 이러한 문제점을 해결하기 위해서 우리가 알고있는 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 놓았다. 이들을 총칭해서 컬렉션 프레임워크라고 한다. List 컬렉션 ArrayList 배열은 생성할 때 크기가 고정되고 사용 중에 크기를 변경할 수 없지만, ArrayList 는 저장용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어난다. 기본 생성자로 객체를 생성하면 내부에 10개의 객체를 저장할 수 있는.. 2020. 3. 22.
heap 메모리와 Garbage Collector 개발을 하면서 대용량 데이터를 인메모리에 저장해서 DB 의 부하를 최소화 하고 속도를 개선하는 작업을 한적이 있다 인메모리에 저장하는 데이터는 대용량 데이터로 주기적으로 스케줄링을 통해서 업데이트 되었다. 여기서 레디스를 사용하여 2가지의 개선점을 두었는데 1. 블루그린 배포시에 인메모리에 데이터를 채우는데 시간이 소모되므로 레디스 캐시를 이용하여 데이터를 불러온다. 2. 스케줄링을 돌릴때 모든 aws 인스턴스에서 ( java project 가 인스턴스당 1개 ) 모두 돌아가면 n 만큼 db에 부하가 걸린다. 따라서 레디스에 시간차 키를 두어서 선별적인 스케줄링을 실행하게 한다. 여기서 문제가 발생하였다. 인메모리에 데이터를 최신화 하는 과정에서 레디스를 사용했는데 레디스 스트림 객체가 heap 메모리를.. 2020. 3. 21.
JPA 연관관계 연관관계 연관관계 중에선 다대일 단방향 관계를 가장 먼저 이해해야 한다. 우리가 흔히 디비에서 데이터를 연관시키려면 외래키를 사용한다. 외래키를 사용하여 정보를 제공하게 되면 자연스럽게 양방향으로 연관관계가 맺어진다. 하지만 객체의 경우엔 주소를 참조로 단방향으로 연관관계가 맺어진다. 만약에 양방향으로 걸고싶으면 서로 참조를 해야한다. 즉, 객체의 경우엔 참조를 통하여 양방향 관계가 아니라 서로 다른방향 관계 2개다. 테이블은 왜래 키로 양방향 연관관계를 맺는다. ( 조인 사용 ) 연관관계 사용 저장 JPA 에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다. JPA 는 참조한 엔티티의 식별자를 외래 키로 사용해서 적절한 등록 쿼리를 생성한다. ( 여기서 연관관계 주인에 대한 개념이 나오는.. 2020. 3. 16.
JPA delete 방법과 심화 delete All transactional 문제 우선 jpa delete 에 대해서 알아보자 delete mapping /{cartId} 로 단일건도 되지만 아무리 생각해봐도 for 문을 돌리면서 클라이언트가 돌리든 서버가 돌리든 .. 비효율일 것 같다는 생각이 들었다. 그래서 찾아본 결과 다음과 같이 list param 으로 사용해도 될것같다는 판단이 들었다. list param 은 콤마로 구분해도 되고, 클라이언트에서 form 으로 전달해도 된다고 한다. @DeleteMapping("/{memberId}/cart") public ResponseEntity deleteCart(@PathVariable(name = "memberId") long memberId, @RequestParam(value = "cartIds") List cartIds) { c.. 2020. 2. 15.
스프링 DI DI 런타임 시점의 의존관계를 결정하고 만들려면 제 3의 존재가 필요하다. 흔히 스프링을 사용하지 않으면 Factory 가 그 역할을 담당한다. Factory 는 두 오브젝트 사이의 런타임 의존관계를 설정해주는 의존관계 주입 작업을 주도하는 존재이며, 동시에 IoC 방식으로 오브젝트의 생성과 초기화, 제공 등의 작업을 수행하는 컨테이너다. 따라서 의존관계 주입을 담당하는 컨테이너라고 볼 수 있고, 줄여서 DI 컨테이너라고 불러도 된다. 의존관계 검색과 주입 스프링이 제공하는 IoC 방법에는 의존관계 주입만 있는 것이 아니다. 코드에서는 구체적인 클래스에 의존하지 않고 런타임 시에 의존관계를 결정한다는 점에서 의존관계 주입과 비슷하지만, 의존관계를 맺는 방법이 외부로부터의 주입이 아니라 스스로 검색을 이용.. 2020. 2. 9.