서론 🫠

한 주 목표

  • 실시간 강의 들으면서 해당 부분 정리하고 실습하기 ⭕️
  • JPA 자바 ORM 표준/이펙티브 자바 읽으면서 TIL 기록, 실습하기 ⭕️
  • 알고리즘 매일 1시간 ❌
    • 효율적인 공부를 위해 어느정도 진도가 나간 이후에 다시 파이썬으로 처음부터 차근차근 공부할 예정이다.
  • 토이 프로젝트 진행 / 완료 가능하면 완료하기

본론 🫠

실시간 강의 들으면서 해당 부분 정리하고 실습하기

실시간 강의 진행했던 파트

  • 상속 / 다형성
  • 인터페이스 / 추상클래스
  • 예외처리

상속 / 다형성 👨‍👩‍👧‍👧

상속다형성 같은 경우는 이전에 제가 첫 자바 공부를 시작했을때도 많이 헤맸던 부분이었습니다.

상속같은 경우는 개인적으로 처음 배웠을때 딱 들었던 생각이

왜 자손클래스의 메소드나 필드에 접근을 하지 못할까 ? 라는 생각이 들었었는데.. 굉장히 멍청했던 생각이었습니다.

단순히 생각해 자식보고 부모닮았네~ 라고 하지만 부모보고 자식닮았네~ 라고 하지는 않는다는 것.. 가장 많은 것을 쓸 수 있는 클래스는 하위 자손클래스 였습니다.

다형성은 상속과 연관이 있는데, 간단히 말해서 자손 클래스가 조상 클래스를 상속하고 있다면, 해당 자손 클래스는 객체 생성시에 부모 객체로 자동 타입 변환이 가능하다는점이 다형성의 가장 큰 특징인것 같았습니다.

인터페이스와 추상클래스 💁🏻

해당 부분도 마찬가지로 전부터 굉장히 헷갈렸던 부분이었습니다.

아무래도 동작 원리가 비슷해서 ..? 라고 생각했고, 실습이 필요한 부분이었습니다.

가장 큰 차이점은

  • 추상클래스
    • 디폴트 메소드로 어떠한 동작을 행하는 메소드를 선언할 수 있다.
    • 메소드를 객체 인스턴스화 당시에 바로 재정의 해준다면 추상클래스도 객체를 생성할 수 있다. (익명객체)
  • 인터페이스
    • 객체를 인스턴스화 할 수 없다.
    • 디폴트 메소드가 존재하지 않고 필드 내 메소드가 모두 추상메소드여야 한다.

정도로 생각했고, 이전에 어떠한 글을 읽은적이 있었는데 추상클래스 같은 경우는 상속 관계를 타고 올라갔을때, 같은 조상클래스를 상속받는데 기능까지 완전히 똑같은 경우에 사용되고 (사람이 걷고 먹고 싸고 자지만 각자의 특징이 달라질 순 있는것처럼)

인터페이스다른 조상클래스를 상속받는데 같은 기능이 필요한 경우에 사용된다는 얘기를 본적이 있습니다. (사람과 동물이 똑같이 걸을 수 있는 것처럼 동작이 겹치는 경우)

해당 부분은 토이프로젝트에서 실습이 가능할 것 같아서 토이프로젝트에서 실습을 진행했습니다.

이펙티브 자바 스터디 💡

이펙티브자바 스터디는 2장을 진행했습니다.

  • 생성자 대신 정적 팩토리 메소드 사용하기
  • 생성자에 매개변수가 많다면 빌더 패턴을 사용해 객체를 생성하기
  • private 생성자나 열거타입으로 싱글턴임을 표기하기
  • 의존 객체 주입 이용하기
  • 다 쓴 객체의 참조를 해제하기
  • 불필요한 객체 생성은 자제하기

이렇게 공부하게 되었고, 해당 부분중에 쓸만한 부분이 굉장히 많았습니다.
이중에서 생성자 대신 정적 팩토리 메소드 사용하기, private 생성자 선언하기, 객체 주입하기, 객체 참조 해제하기

정도를 토이프로젝트에서 사용해보았습니다.

   public static Customers getInstance() {
        if (instance == null) {
            instance = new Customers(ClassifiedCustomers.getInstance());
        }
        return instance;
    } // 객체를 리턴해주는 정적 팩토리 메소드 

해당 코드는 단순 싱글톤 객체를 반환해주는 메소드이지만, 객체가 이미 인스턴스화 된 상태라면 해당 인스턴스를, 아니라면 인스턴스화 해서 반환해주는 팩토리 메소드 라고도 할 수 있습니다.

거기에 메소드 이름은 getInstance 이기 때문에 어떠한 역할을 하는지 확실히 알 수가 있습니다. (정적 팩토리 메소드의 장점이기도 합니다.)

    private final Customers customers;

    private CustomerMenu(Customers customers) {
        this.customers = customers;
    } // 의존성을 가지고있는 객체를 필요시에 직접 주입해 이용하기

지금 당장은 고객을 상징하는 Customers 클래스에만 의존하지만, 나중에 서비스가 커져서 AStoreCustomers 이 생기고 B,C .. 이렇게 Customers를 상속받는 하위 타입의 객체를 주입할 일이 생기는것을 고려해 (다형성의 특징과 장점이기도 합니다.)

처음부터 final Customers = Customers.getInstance(); 를 필드에 선언하지 않고 생성자로 주입받도록 구현합니다.

직접 설명이 가능한 부분은 이정도인것 같습니다. 😃

JPA 자바 ORM 기술 표준 책 스터디 💡

처음으로 접하는 김영한님의 책이었습니다.

개인적으로 이 책을 구매한 이유는 기존에 JPA를 이용하면서 이 행동들이 어디서부터 어떠한 논리를 갖고 동작을 시작하는지가 궁금했고,
단순히 SQL 문법을 크게 이해하지 않고 사용해도 되는 프레임워크 라는 생각이 들지 않아서 더 디테일하게 공부해보고 싶은 마음이 있었습니다.

엔티티에대한 정의와 영속성 컨텍스트

기존에 JPA를 이용해보면서 느꼈던 궁금증은, 모두가 말하는 그 영속성이 도대체 무엇인지와 엔티티 엔티티라는데 그 엔티티에대한 정의를 못내리겠던게 가장 컸습니다.

일단 첫 시작으로는 객체와 관계형 데이터베이스의 구조 차이로 인한 문제를 JPA가 해결해주기 때문에 이용을 한다.. 라고 큰 틀을 정리하게 되었습니다.

(기존에는 JPA를 퉁쳐서 하나의 기술이라 생각했지만, JPA가 모든것을 관리해주는게 아닌 JPA는 객체와 관계형 데이터베이스에 대한 값들을 연결 시켜준다면, 하이버네이트는 우리가 직접 SQL문을 작성할 필요가 없이 해당 연결 정보를 기준으로 쿼리를 실행해준다..! 라는것을 알게되었습니다.)

여기서 엔티티에 대한 정의를 내릴 수 있게 되었는데요, 기존에 저희가 자바를 사용할때 자주 작성하던 자바빈 규약을 따르는 도메인 클래스 같은 것들이 결국엔 비즈니스 요구사항을 모델링 한 객체의 설계도 라고 할 수 있습니다.

해당 설계도로 생성된 객체를 엔티티 라고 한다.. 정도로 정리를 했습니다.

예를 든다면 저희가 텀블러를 제작할때 해당 텀블러에 들어가는 재료와 크기, 모양, 등등을 정의해 제작된 텀블러를 엔티티라고 할 수 있다는 것입니다.
(아니라면 지적해주세요😇)

영속성 컨텍스트 같은 경우는 어떻게 보았을때 스프링 컨텍스트와도 비슷하다고 생각했습니다.

기존에 엔티티를 주고받을때 사용했던 JPARepository 가 해당 영속성 컨텍스트에 의해 엔티티를 관리한다는것을 알게되었습니다.

말그대로 엔티티는 단순히 엔티티 객체가 생성되어 데이터베이스에 바로 저장되고 저장된 객체를 꺼내 수정해 다시 저장하고 삭제하고..

이렇게 진행되는 것이 아닌 엔티티를 엔티티 메니저에 저장(persist) 하게 된다면
객체가 사라지는 것이 아닌 해당 엔티티로 어떠한 작업을 하기위한 모든 행동이

직접 데이터베이스를 거치기 전에 영속성 컨텍스트에서 객체를 꺼내와서 동작을 한다는것이었습니다.

이렇게 엔티티를 조회하게 된다면 해당 엔티티가 반환되고 끝인게 아닌 또다른 저장소에 저장후 해당 엔티티로 다시 작업을 하게 될때는 데이터베이스를 거칠 필요 없이 해당 저장소에서 꺼내와 작업을 하는것이었습니다.

해당 파트에대한 공부로 인해서 더더욱 머릿속에 이동 경로가 더 잘 그려지는것 같은 느낌이었습니다.

토이프로젝트 😇

첫번째 토이 프로젝트 리뷰 - 고객 등급 관리 프로그램

이번 토이프로젝트는 객체지향이라는걸 최대한 신경써가며 진행하려고 노력했습니다.

해당 토이프로젝트를 진행하면서 얻은것들이 있습니다.

  • 코드를 짤때 코드의 문맥이 마치 대화가 진행되는것처럼 흘러간다는것을 알게되었습니다. 앞으로 로직을 짤때 어딘가가 걸리는 부분이 있다면 문장의 문법,단어선택 등등을 신경쓴다는 생각으로 수정한다면 괜찮은 결과물이 나오지 않을까 하는 생각이 들었습니다.
    public void deleteCustomerBySerialId(String id) { //고유번호로 등록 고객 삭제
        for (int i = 0; i < customerCount; i++) {
            if (customers[i] != null) {
                if (customers[i].getId().equals(id)) {
                    for (int j = i; j < customerCount - 1; j++) {
                        customers[j] = customers[j + 1];
                    }
                    customers[customerCount - 1] = null;
                    customerCount--;
                    System.out.println("고객이 삭제되었습니다.");
                    trimToSize();
                    return;
                }
            }
        }
    }

해당 코드같은 부분은 작성을 하면서 "나 너가 알려준 아이디로 고객 삭제할게~" 라는 시작과 함께
"너가 알려준 아이디를 창고에서 찾을건데 해당 창고에 물건이 있다면 해당 아이디랑 일치하는지 비교를 해볼게~

그리고 일치하는게 있다면 해당 창고 칸부터 뒤에있던 물건들을 앞으로 당겨오고 맨 마지막에 있는 창고는 비울거야~ 그리고 창고 번호는 물건이 비었으니 하나 줄일게~"

이렇게 뭔가 문맥상 진행되는 흐름이 있다는것을 알게되었습니다.

이와 별개로 여러가지 느낀점과 겪었던 부분은 해당 글에 정리되있으니 궁금하시다면 읽어보세요!

좋았던점 🥰

  • 이펙티브 자바 같은 경우에는 뭔가 심화 응용파트를 알려주는것 같았습니다. 해당 부분을 공부하면서 제가 모르고 써왔던 것들의 역할이 무엇인지 어느정도 짐작이 가능해졌습니다 😆

  • JPA같은 경우도 책을 공부하면서 엔티티가 영속성 컨텍스트에 의해 어떻게 흘러가는지 머릿속에 그림이 그려지는것 같습니다!

  • 토이프로젝트를 진행하면서 객체지향에 대해서 한걸음 더 가까워진 것 같습니다. 별개로 도메인주도설계.. 를 살짝 찍먹해본 느낌입니다. 이 부분에 대해서 흥미가 생겼습니다.

  • 앞으로 진행할 프로젝트들의 첫 시작이 지금보다 더 좋아질거라는 기대감이 듭니다.

아쉬웠던점 🥹

  • 알고리즘에 대한 공부가 소홀했던 한 주 였습니다. 지금 당장 알고리즘에 신경쓰기에는 해야할것들이 굉장히 많았고, 알고리즘 문제를 풀다보면 어느순간 한 문제 푸는데 몇시간을 쓰고있는 제 자신을 발견하고 곧바로 포기해버렸습니다.

결론

이번 한 주는 여러 방향으로 많은것을 얻어가는것 같은 한주였습니다. 앞으로도 이렇게만 하길... 🤪

profile
자스코드훔쳐보는변태

0개의 댓글