워밍업 클럽 day4 미션
본 게시글은 인프런 워밍업 클럽 워밍업 클럽 2기 BE 클린코드&테스트의 day4 미션의 내용을 작성하였습니다! 1. [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 읽기 좋은 코드로 리팩토링public boolean validateOrder(Order order) { if (order.isItemEmpty()) { // getter를 빼고 메서드로 변경 throw new AppException("주문 항목이 없습니다."); //log를 예외처리로 변경 } // 띄어쓰기로 맥락 나누기 if (order.isTotalPriceOverZero()) { if (order.hasCustomerInfo()) { !연산자 빼기위해 내용을 바꾸기 ..
2024.10.03
1. Flux의 기본
1. Flux의 개념 - 기존의 동기식 프로그램은 한 개의 작업이 끝나고 다른 작업을 실행하는 Blocking 방식의 프로그래밍 - 그런데, 한 번에 여러개의 작업을 계속 처리하는 것을 Non-blocking 방식의 프로그래밍. - Flux는 데이터 스트림을 통해 작업을 비동기적으로 처리하고, 데이터가 준비되면 그 즉시 처리할 수 있도록 해준다. => 반응성이 뛰어나고 많은 양의 데이터를 처리하는 것에 효율적임. 1-2. Flux와 Mono의 차이 - Flux는 0개 이상의 값을 가질 수 있고, Mono는 0개 또는 1개의 값을 가진다. - Reactive Stream은 Publisher가 Subscriber에게 데이터를 제공하는 개념이며, Flux와 Mono는 이러한 Publisher의 구현. 2. L..
2024.04.16
no image
5주차 overriding, overloading + up/down casting
간단하게 정리해보았다!! + up casting / down casting 1. 업캐스팅 - 하위 클래스의 인스턴스를 상위 클래스의 형식으로 형 변환을 시키는 것이다. - 이는 자동으로 되기때문에 다운캐스팅처럼 명시적으로 타입을 적어주지 않아도 된다. e.g. ParentClass obj1 = new ChildClass(); 2. 다운캐스팅 - 상위 클래스의 참조를 하위 클래스의 참조로 바꾸는 것이다. - 다운캐스팅은 자동으로 되지 않기 때문에 명시적으로 타입을 적어주어야 한다. (안 하면 컴파일 오류 발생) e.g. ChildClass obj2 = (ChildClass)obj1; 3. 다운캐스팅 주의! - 업캐스팅 되어있지 않은 상태에서 다운캐스팅을 하면 컴파일은 가능하지만 실행시 ClassCastEx..
2024.04.11
no image
4주차 Interface + Observer Pattern
* 추상클래스와 인터페이스 - 설명을 예시를 들어 쉽게 해주시는 얄코님의 강의에서 추상클래스는 물려받는 혈통 가문과 같이 딱 하나만 받을 수 있는 나의 정체성이고, 인터페이스는 여러개를 받을 수있는 자격증과 같은 개념이라고 했다. - 또한 아래 참고에 적어놓은 블로그에서는 "극단적으로 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 역할이자 개념"이라고 정의하고있다. - 즉, 어떠한 클래스들이 운전면허증, 복어조리자격증, 주조자격증 등과 같이 어떠한 동일한 목적을 가지고 동일한 기능을 수행할 수 있도록 그런 기능을 모아놓은 인터페이스를 적용하는 것이다. * 인터페이스의 특징 - 다중상속 가능 (자격증은 100개라도 가질 수 있다..) - 생성자 사용 불가: 인터페이스는 메서드의 명세를 정의하고 ..
2024.03.20
no image
3주차 Annotation
Annotation이란? - 소스코드에 메타데이터를 추가한 컴퓨터를 위한 주석 - 비즈니스 로직에는 영향을 주지 않고, 컴퓨터에게 어떻게 코드를 처리할지에 대한 정보를 제공하는것 - @이름(인자) : 인자가 없을 경우 괄호는 생략 가능 - 장점: 가독성, 유지보수, 간결함, 표준화 등. Annotation 종류 1. 빌트인 어노테이션 - @Override: 메서드가 오버라이드 됐다는 것을 검증. - @SuppressWarnings: 컴파일러의 경고 무시하라는 것. 경고는 오류가 아니기때문에 내가 의도하고 코드를 짤 때 경고를 하지 말라는 의미 - @SafeVarargs: 제네릭 같은 가변인자를 사용할 때 경고를 무시 - @FunctionalInterface: 람다식을 위한 인터페이스를 지정. 함수형 인터..
2024.03.06
no image
2주차 Optional
자바에서 nullPointException을 만나는 이유 - null을 리턴하고 null 체크를 안 해줘서 2. 메서드에서 값을 제대로 리턴할 수 없을 때 사용하는 방법 - 예외처리 - null 리턴 - optional 리턴 3. Optional이란? - 값을 0개 또는 1개 담을 수 있는 컨테이너 - 래퍼클래스 - 리턴되는 값이 null이 올 수도 있다는 것을 명시적으로 알려줌. 4. 사용 - 래퍼클래스이기 때문에 primitive타입을 담을 때에는 OptionalInt나 OptionalLong을 사용해야 박싱 언박싱을 피해서 성능을 살릴 수 있다. - 리턴값에서만 사용한다. 1) 파라미터로 받을 때에는 굳이 한 번더 optional에서 null체크를 해주어야한다. null일 때 isPresent를 사..
2024.03.06
no image
1주차 Stream
스트림이란? - 연속된 데이터를 처리하는 오퍼레이션의 모음. (파이프라인안에서 순서대로 일을 처리하고 빠져나가는 모양) - 데이터가 아니고 컬렉션과 같은 데이터를 소스로 사용하여 처리를 하는 기능. - 처리하는 과정에서 원본 데이터가 변경되는 것이 아니다. 2. 구성요소 - 스트림 파이프라인: 0 또는 다수의 중개 오퍼레이션과 한개의 종료 오퍼레이션으로 구성한다. - 종료 오퍼레이션이 오지 않으면 중개오퍼레이션은 실행되지 않음 - 중개 오퍼레이션: stream을 리턴한다. filter, map, limit, skip, sorted 등. - 종료 오퍼레이션: stream을 리턴하지 않는다. collect, allMatch, count, forEach 등 3. 장점 - for, forEach같은 반복문을 사..
2024.02.08
no image
NINNong 1. 프로젝트 세팅
스프링부트 스터디를 하면서 내 프로젝트를 만들어보고싶었다!! 그래서 시작한 즐농 프로젝트. ㅋㅋ 1. 인텔리제이에 스프링 프로젝트를 만들기. - 내가 쓰고싶은 디펜던시들을 욕심부려서 처음부터 다 넣어놨는데 db를 연결해주지 않은채로 jpa를 넣어놔서 이런 오류가 발생했다! 얼른 주석처리 했음. Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class - mysql db연결을 했는데 계속 로그인 창이 나왔다. 처음보는 현상이고 이 전에 스터디했던..
2024.01.16

본 게시글은 인프런 워밍업 클럽 워밍업 클럽 2기 BE 클린코드&테스트의 day4 미션의 내용을 작성하였습니다!

 

1. [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 읽기 좋은 코드로 리팩토링

public boolean validateOrder(Order order) {
    if (order.isItemEmpty()) { // getter를 빼고 메서드로 변경
        throw new AppException("주문 항목이 없습니다."); //log를 예외처리로 변경
    }
       // 띄어쓰기로 맥락 나누기
    if (order.isTotalPriceOverZero()) {
        if (order.hasCustomerInfo()) { !연산자 빼기위해 내용을 바꾸기 
            return true;
        }
        
        throw new AppException("사용자 정보가 없습니다.");
    }

    throw new AppException("올바르지 않은 총 가격입니다.");
}

 

 

2. SOLID에 대하여 자기만의 언어로 정리

 

1. 단일 책임 원칙 (Single Responsibility Principle)

한 클래스는 딱 한 가지 일만 해야 한다. 여러 가지 일을 하다 보면 나중에 무슨 일이 어디서 꼬였는지 알기 어려워지기 때문이다..

2. 개방-폐쇄 원칙 (Open/Closed Principle)

코드는 고칠 필요 없이 기능 추가가 가능해야 한다. 새로운 기능을 넣을 때 기존 코드를 막 건드리면 문제가 생길 수 있으니까, 늘 확장 가능하게 만들고 변경은 피하는 게 좋다.

3. 리스코프 치환 원칙 (Liskov Substitution Principle)

부모 클래스가 있으면, 그걸 상속받은 자식 클래스도 부모처럼 쓸 수 있어야 한다. 자식이 부모처럼 행동 못 하면 코드가 막 꼬여버린다.

4. 인터페이스 분리 원칙 (Interface Segregation Principle)

인터페이스는 필요한 기능만 딱딱 나눠서, 쓸데없는 기능까지 구현하느라 고생하지 않게 해야 한다. 

5. 의존 역전 원칙 (Dependency Inversion Principle)

구체적인 거에 의존하지 말고, 추상적인 것에 의존해야 한다.  세부 사항에 묶이지 말고 큰 틀에서 서로 의존하게 만들어야 함. 그러면 나중에 세부 사항이 바뀌어도 큰 틀은 유지될 수 있다.

 

 

https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95/dashboard

 

Readable Code: 읽기 좋은 코드를 작성하는 사고법 강의 | 박우빈 - 인프런

박우빈 | 이 강의를 통해 클린 코드 원칙에 대한 깊은 이해를 하고, 객체 지향 사고 방식에 입각한 깔끔한 코드를 작성할 수 있게 됩니다. 클린 코드와 객체 지향이 궁금한 분, 코드를 정말 잘 짜

www.inflearn.com

 

 

1. Flux의 개념

- 기존의 동기식 프로그램은 한 개의 작업이 끝나고 다른 작업을 실행하는 Blocking 방식의 프로그래밍

- 그런데, 한 번에 여러개의 작업을 계속 처리하는 것을 Non-blocking 방식의 프로그래밍. 

- Flux는 데이터 스트림을 통해 작업을 비동기적으로 처리하고, 데이터가 준비되면 그 즉시 처리할 수 있도록 해준다. => 반응성이 뛰어나고 많은 양의 데이터를 처리하는 것에 효율적임.

 

1-2. Flux와 Mono의 차이

- Flux는 0개 이상의 값을 가질 수 있고, Mono는 0개 또는 1개의 값을 가진다.

- Reactive Stream은 Publisher가 Subscriber에게 데이터를 제공하는 개념이며, Flux와 Mono는 이러한 Publisher의 구현.

 

2. List와 뭐가 다를까 ?

-  동기적 상황에서는 List를 쓰고, 비동기적 상황에서는 Flux or Mono를 사용한다.

-  데이터를 조금씩 처리할 수 있어서 메모리 사용량을 줄일 수 있다. 

   List는 1부터 100까지의 수를 한 번에 저장해놓고 필요한 순간에 가져와서 사용하지만 Mono와 Flux는 필요한 순간에 값을 생성해서

   메모리를 줄일 수 있다고 한다.

- 비동기적 또는 리액티브한 프로그래밍에서 더 유연하고 확장가능한 해결책을 제시해준다고 한다. 

 

3. 기본적인 Flux 사용법

// 1. 그냥 생성
Flux<String> flux1 = Flux.just("Apple", "Banana", "Orange");

// 2. Iterable 객체를 기반으로 Flux 생성
List<String> fruits = Arrays.asList("Apple", "Banana", "Orange");
Flux<String> flux2 = Flux.fromIterable(fruits);

// 3. 빈 Flux 생성
Flux<String> flux3 = Flux.empty();

// 4. 주어진 범위 내의 값을 생성
Flux<Integer> flux4 = Flux.range(1, 5);

// 5. 주어진 Supplier or BiFunction을 사요ㅕㅇ해서 값을 생성하는 Flux를 생성
Flux<String> flux5 = Flux.generate(
        () -> 0, // 상태(초기값)를 생성하는 역할인 Supplier
        (state, sink)   -> {
            sink.next("Value_" + state);
            if(state == 5 ) sink.complete();
            return state +1;
        }
);

// 6. 주어진 FluxSink를 사용하여 값을 생성하는 Flux를 생성. 주의! 직접 사용하기 보다는 'FluxSink'를 사용하여 커스텀 발행 로직을 구현할 때 사용.
Flux<String> flux6 = Flux.create(sink -> {
    sink.next("Apple");
    sink.next("Banana");
    sink.complete();
});

/* FluxSink
    next()
    error()
    complete()
*/

// 인덱스를 뽑기.
flux1.elementAt(1)
        .subscribe(System.out::println);

// 순차적으로 뽑기.
// 첫 번째, 데이터 핸들링 함수: Flux or Mono에서 발생한 데이터를 처리
// 두 번쨰, 에러 핸들링 함수: Flux or Mono에서 에러가 발생했을 때 처리할 작업
// 세 번째, 완료 핸들링 함수 : Flux or Mono에서 데이터 발행이 완료되었을 떄 실행할 작업
flux6.subscribe(
        data -> System.out.println(data),
        error -> System.err.println("Error occurred: " + error),
        () -> System.out.println("Completed!")
);

 

 

4. 단점

 - 비동기적이고 이벤트 기반의 프로그래밍을 지원하기 떄문에 코드가 복잡해질 수 있다. 

 - 당연히 비동기적이기 때문에 순서보장이 어렵다 

 - 따라서 이벤트 루프나 쓰레드 풀이 필요할 수 있기때문에 오버헤드가 발생할 수 있다.

 - 스트림을 처리하는 동안 리소스 누수가 발생할 수 있다. (예를 들어 create에서 complete()을 안 해준다..)

=> 이런 단점을 커버하기 위해 적절한 코드 사용이 필요한데 기존의 동기식 프로그래밍과 많이 다르기때문에 학습곡선이 높다!

간단하게 정리해보았다!!

 

 

+ up casting / down casting

 

1. 업캐스팅

- 하위 클래스의 인스턴스를 상위 클래스의 형식으로 형 변환을 시키는 것이다. 

- 이는 자동으로 되기때문에 다운캐스팅처럼 명시적으로 타입을 적어주지 않아도 된다.

e.g. ParentClass obj1 = new ChildClass(); 

 

2. 다운캐스팅

- 상위 클래스의 참조를 하위 클래스의 참조로 바꾸는 것이다.

- 다운캐스팅은 자동으로 되지 않기 때문에 명시적으로 타입을 적어주어야 한다. (안 하면 컴파일 오류 발생)

e.g. ChildClass obj2 = (ChildClass)obj1;

 

3. 다운캐스팅 주의!

- 업캐스팅 되어있지 않은 상태에서 다운캐스팅을 하면 컴파일은 가능하지만 실행시 ClassCastException이 발생한다.

e.g. ParentClass obj3 = new ParentClass(); 

       ChildClass obj4 = (ChildClass)obj3; => xxxxxx

- 따라서 instanceof 연산자를 확인해서 형을 확인한 다음 다운캐스팅을 하는 것이 좋다.

 

4. 업캐스팅이 자동으로 되는 이유

- 상위 클래스로 형변환을 해서 인스턴스를 생성하면 상위/하위 클래스의 메서드와 필드에 접근할 수 있게 메모리가 생성된다. 그래서 자동으로 상위의 필드와 메서드를 찾을 수 있기때문.

 

5. 그럼 다운캐스팅은 명시적으로 형변환을 해야하는 이유는?

- 상위클래스에는 여러개의 하위 클래스가 있을 수 있기 때문에 컴파일러가 짐작해서 맞힐 수 없다. 누구로 형변환을 해야할지 찝어줘야 하는 것.

 

6. 업캐스팅이 되어있지 않을 때에는 당연히 하위 클래스에 대한 정보가 없기 때문에 형변환을 할 수 없는 것인가??

- 정답이다.

 

7. 업/다운 캐스팅의 장점

- 다형성: 여러 클래스를 동일한 상위 클래스로 다룰 수 있고, 또 여러 하위 클래스의 동작을 수행할 수 있다.

- 코드 재사용성: 상위 클래스의 참조를 사용하여 여러 하위 클래스를 처리할 수 있으므로 코드의 재사용성이 높다!

- 확장성과 유연성: 업캐스팅을 통해 새로운 클래스를 추가하거나 기존 클래스를 수정하지 않고도 코드를 확장할 수 있다.

- 하위 클래스의 특수한 기능 사용: 업캐스팅된 객체를 다운캐스팅하여 하위 클래스의 특수한 기능을 사용할 수 있다. 특정한 상황에 필요한 하위 클래스로 형변환해서 기능을 사용하면 된다~

'자바 스터디' 카테고리의 다른 글

4주차 Interface + Observer Pattern  (0) 2024.03.20
3주차 Annotation  (1) 2024.03.06
2주차 Optional  (0) 2024.03.06
1주차 Stream  (0) 2024.02.08

 

* 추상클래스와 인터페이스

   - 설명을 예시를 들어 쉽게 해주시는 얄코님의 강의에서 추상클래스는 물려받는 혈통 가문과 같이 딱 하나만 받을 수 있는 나의 정체성이고, 인터페이스는 여러개를 받을 수있는 자격증과 같은 개념이라고 했다. 

   - 또한 아래 참고에 적어놓은 블로그에서는 "극단적으로 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 역할이자 개념"이라고 정의하고있다.

    - 즉, 어떠한 클래스들이 운전면허증, 복어조리자격증, 주조자격증 등과 같이 어떠한 동일한 목적을 가지고 동일한 기능을 수행할 수 있도록 그런 기능을 모아놓은 인터페이스를 적용하는 것이다.

 

* 인터페이스의 특징

    - 다중상속 가능 (자격증은 100개라도 가질 수 있다..)

    - 생성자 사용 불가: 인터페이스는 메서드의 명세를 정의하고 구현을 강제하기 위한 것이며, 실제 객체 생성은 인터페이스를 구현한 클래스에서 이루어진다.

 

* 인터페이스에 사용되는 4가지

    - 상수 : 필드는 무조건 상수로 선언해야한다. final 키워드를 빼도 된다. 어차피 무조건 상수이니까!

    - 클래스 메서드: 재정의가 불가능한 구현 메서드. 무조건 사용!!

    - 디폴트 메서드: 재정의가 가능한 구현 메서드. 사용하던 말던 괜찮다

    - 추상 메서드 : 메서드 이름만 정의되어있는 추상메서드. abstract 키워드는 빼도 된다. 

 

* 구상 메서드가 추가된 이유

    - 인터페이스 내에서 클래스, 디폴트 메서드는 자바8에서 추가된 기능이다. 

    - A라는 클래스를 사용하고 있는데 b라는 기능이 추가로 나왔을 때 이 b라는 기능을 추상메서드로 추가하게되면 A클래스를 사용하고 있는 곳에서는 모두 b라는 기능을 오버라이드 해주어야한다... 이런 문제를 해결할 수있다.

 

* static 메서드와 default 메서드의 차이

    - static은 이미 구상되어있는 메서드이지만 무조건! 이대로 사용해야하고 수정할 수없다.

    - default는 이미 구상되어있는 메서드이지만 불가피하게 변경을 해야할 때 재정의를 해서 사용할 수 있다.

 

 

 

*Observer pattern

- 옵저버패턴은 객체 간의 일대다 의존관계를 정의하는 패턴이다. 주로 한 객체(subject)의 상태가 변경될 때 이와 관련된 다른 객체들에게 자동으로 알림을 전달할 떄 사용된다. 

=> 객체간의 결합도를 낮추고 유연성을 향상시킴.

 

- Subject: 상태를 관찰하고 관찰자들에게 알림을 보내는 주체. 관찰자인 옵저버를 등록하고 해제하는 메서드를 가지고 있어야함

- Observer: 관찰자는 Subject의 상태 변화를 감지하고 이에 따른 동작을 수행하는 객체. 

 

- 자바에서는 java.util 패키지에 Observerble 클래스와 Observer 인터페이스가 기본적으로 제공되어 이를 사용해서 구현할 수 있다!

- Observable클래스는 deprecated되어서 java.beans 패키지의 PropertyChangeSupport를 사용하는 것을 권장한다고 한다......

- 그리고 Observable이 interface가 아닌 클래스여서 커스텀해서 사용할 수 없다는 단점도  또 있다!

-> 그래서 그냥 만들어서 사용하는게 낫지 않을까..~ 

 

 

 

* 공부하며 만들어본 팀 채팅 알람 기능!

- ChatSubject라는 subject interface는 observer를 등록하고 해제하고 알림을 실행할 수 있는 메서드를 가지고 있다.

- TeamChat 클래스는 ChatSubject를 implements한 클래스이고 주요 동작인 sendMessage() 를 추가해서 캡슐화를 했다.

- ChatObserver는 update()기능을 가지고 있는 interface이다.

- TeamMember는 ChatObserver를 implements한 클래스이다. 



TeamChat 객체를 만들어서 TeamMember들을 넣어놓으면 TeamMember는 TeamChat에서 메세지가 오는지 감지할 수 있다.

메세지가 오는 것을 전달 전달받으면 각각 메세지를 전달받을 수 있다.

당연하게도 detach로 주제에서 member를 빼면 상태 변화를 감지할 수 없다.

ChatAlarmObserver

 

 

 

 

 

** 참고자료 **

 

- 인프런 얄코 제대로 파는 자바  

-https://velog.io/@hanna2100/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-2.-%EC%98%B5%EC%A0%80%EB%B2%84-%ED%8C%A8%ED%84%B4-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%98%88%EC%A0%9C-observer-pattern

- https://limkydev.tistory.com/197

'자바 스터디' 카테고리의 다른 글

5주차 overriding, overloading + up/down casting  (0) 2024.04.11
3주차 Annotation  (1) 2024.03.06
2주차 Optional  (0) 2024.03.06
1주차 Stream  (0) 2024.02.08

 

Annotation이란?

 

-  소스코드에 메타데이터를 추가한 컴퓨터를 위한 주석

- 비즈니스 로직에는 영향을 주지 않고, 컴퓨터에게 어떻게 코드를 처리할지에 대한 정보를 제공하는것 

-  @이름(인자) : 인자가 없을 경우 괄호는 생략 가능

-  장점: 가독성, 유지보수, 간결함, 표준화 등.

 

Annotation 종류 

 

1. 빌트인 어노테이션 

    - @Override: 메서드가 오버라이드 됐다는 것을 검증.  

    - @SuppressWarnings: 컴파일러의 경고 무시하라는 것. 경고는 오류가 아니기때문에 내가 의도하고 코드를 짤 때 경고를

          하지 말라는 의미 

    - @SafeVarargs: 제네릭 같은 가변인자를 사용할 때 경고를 무시   

    - @FunctionalInterface:  람다식을 위한 인터페이스를 지정. 함수형 인터페이스라는 것을 명시함.

    - @Deprecated :사용하지 말라고 알리는 것, 더 나은 새로운 기능이 생겼다거나, 앞으로 사용하지 않는다거나, 곧 사라질 것이라거나, 

       

2. 메타 어노테이션

    - @Retention : 어노테이션이 유지되는 범위 

        1) SOURCE : 소스 파일에 적용 

        2) CLASS : 컴파일 시 적용. default 

        3) RUNTIME: 실행시 적용

    - @Target (ElementType.T): 어노테이션이 적용될 수 있는 대상 지정

        1)  ANNOTATION_TYPE: 

        2) CONSTRUCTOR: 생성자

        3) FIELD:  필드

        4) LOCAL_VARIABLE: 지역 변수

        5) METHOD: 메서드

        6) PACKAGR: 패키지

        7) PARAMETER: 매개변수

        8) TYPE : 클래스, 인터페이스, 어노테이션, 열거형

        9) TYPE_PARAMETER:  제네릭 타입 매개변수

        10)TYPE_USE: 클래스, 인터페이스, 제네릭 타입, 배열, 캐스팅, 람다 표현식 등 타입 사용 위치

        11)MODULE: 모듈

  - @Documented: 해당 어노테이션을 사용하면 문서화 될 수 있음을 명시.

  - @Inherited: 하위 클래스에 상속할 수 있다.

  - @Repeatable: 어노테이션을 반복적으로 선언 가능

 

3.  사용자 정의 어노테이션

- 메타 어노테이션을 활용해서 내가 필요한 어노테이션을 만드는 것

@Retention(용도)
@Target(범위) // 여러 개를 동시에 선언 가능(배열이기 떄문에 중괄호로 묶는다)
...
public @Interface AnnotationName {
	T methodName();
	...
}

-  @Retention과 @Target은 사용해주는 것이 코드의 가독성과 유지보수성을 향상시키고, 어노테이션의 사용 방법을 명확히한다.

-  효율이 나지 않을 수 있기 때문에 필요한 때에만 사용하는 것이 좋다.

 

 

https://ggop-n.tistory.com/88

https://seongeun-it.tistory.com/142

https://blog.naver.com/kang594/39704853

'자바 스터디' 카테고리의 다른 글

5주차 overriding, overloading + up/down casting  (0) 2024.04.11
4주차 Interface + Observer Pattern  (0) 2024.03.20
2주차 Optional  (0) 2024.03.06
1주차 Stream  (0) 2024.02.08

2주차 Optional

sean00
|2024. 3. 6. 21:41

 

  1. 자바에서  nullPointException을 만나는 이유
  • - null을 리턴하고 null 체크를 안 해줘서

 

2. 메서드에서 값을 제대로 리턴할 수 없을 때 사용하는 방법

  • - 예외처리
  • - null 리턴
  • - optional 리턴

3. Optional이란?

  • -  값을 0개 또는 1개 담을 수 있는 컨테이너
  • - 래퍼클래스
  • - 리턴되는 값이 null이 올 수도 있다는 것을 명시적으로 알려줌.

 

4. 사용

  • -  래퍼클래스이기 때문에 primitive타입을 담을 때에는 OptionalInt나 OptionalLong을 사용해야 박싱 언박싱을 피해서 성능을 살릴 수 있다.
  • - 리턴값에서만 사용한다. 
  •   1) 파라미터로 받을 때에는 굳이 한 번더 optional에서 null체크를 해주어야한다. null일 때 isPresent를 사용하면 바로 nullPointException
  • -> argument를 넘길때는 optional로 감싸지 않고 보내고 파라미터에는 optional로 받는 문제
  •   2) 인스턴스 필드에 Optional을 사용하지 않는다.  get 메서드에서 Optional로 리턴해줄 수 있음 . optional.of(value) 또는 optional.nullable(value) -> null일 가능성이 있을 때는 nullable로 리턴해야 nullPointException이 안 난다. 
  •   3) null을 리턴하지 말자. -> Optional.empty()를 리턴
  •  
  • - Collection, Map, Stream, Array, Oprional과 같은 컨테이너 타입의 인스턴스들은 Optional로 감싸지 않는다. 그 자체로 null인지 아닌지 알 수 있기 때문에 필요가 없음.

 

5. 메서드

  • - isPresent(), isEmpty()-이건 11부터 
  • - get() -> isPresent() 등으로 확인 하지 않고 실행할때 null이면 noSuchElementException 발생. 근데 가급적이면 아래의 메서드들로 실행하면 좋다
  • - ifPresent()  -> 만약에 값이 있으면 어디에 담지 않고 바로 람다로 ~실행
  • - orElse() 값이 있으면 가져오고 없는 경우에는 ~~를 리턴하라 (있던 없던 연산 무조건 실행)
  • - orElseGet() 값이 있으면 가져오고 없는 경우에 ~~를 하라.
  • - orElseThrow() 값이 있으면 가졍고 없는 경우 에러를 던져라.
  • - Optional filter(Predicate) 값 걸러내기
  • - Optional Map(Function) 값 변환하기
  • - Optional flatMap(Function) -> map으로 꺼내온 타입 자체가 Optional이면 Optioanal 안에  Optional이 있는 것이다. 이러면 데이터를 까야한다. 그런데 flatMap을 쓰면 이미 과정에서 한 번 꺼내줌
  •  

 

 

 

- 참조

더 자바 - JAVA8 (백기선 인프런강의)

'자바 스터디' 카테고리의 다른 글

5주차 overriding, overloading + up/down casting  (0) 2024.04.11
4주차 Interface + Observer Pattern  (0) 2024.03.20
3주차 Annotation  (1) 2024.03.06
1주차 Stream  (0) 2024.02.08

1주차 Stream

sean00
|2024. 2. 8. 20:37

  1. 스트림이란?

     - 연속된 데이터를 처리하는 오퍼레이션의 모음. (파이프라인안에서 순서대로 일을 처리하고 빠져나가는 모양)

     -  데이터가 아니고 컬렉션과 같은 데이터를 소스로 사용하여 처리를 하는 기능.

     - 처리하는 과정에서 원본 데이터가 변경되는 것이 아니다.

 

2. 구성요소

  • - 스트림 파이프라인: 0 또는 다수의 중개 오퍼레이션과 한개의 종료 오퍼레이션으로 구성한다. 
  • - 종료 오퍼레이션이 오지 않으면 중개오퍼레이션은 실행되지 않음
  •     - 중개 오퍼레이션: stream을 리턴한다. filter, map, limit, skip, sorted 등. 
  •     - 종료 오퍼레이션: stream을 리턴하지 않는다. collect, allMatch, count, forEach 등

 

3. 장점

    - for, forEach같은 반복문을 사용하는 것보다 코드가 간결해지고, 각 단계가 명확하게 표현된다.

    - 병렬 처리를 쉽게할 수 있는 기능을 제공해서 성능을 향상시킬 수 있다. 

    - 필요할 때만 요소를 처리하므로, 필요하지 않은 연산을 피할 수 있다. -> 성능을 최적화하는 것에 도움이 됨

    - 함수형 프로그래밍 개념을 적용해서 그의 장점인 코드 재사용성은 높아지고 부작용은 줄일 수 있다. 

 

4. 단점

    - 추가적인 객체 생성과 메서드 호출로 인한 성능 오버헤드가 발생할 수 있다. 

예)

     public class Main {
    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>();
        fruits.add("apple");
        fruits.add("banana");
        fruits.add("orange");
        fruits.stream().map(String::length).forEach(System.out::println);
    }
}

    - 함수형 프로그래밍의 개념과 메서드 체인 연산 등의 개념을 이해해야 잘 사용할 수 있다.

    - for문보다 속도는 느리다. (for문은 인덱스 기반이다. 메모리 접근이라 빠름 / stream은 jvm이 이것저것 처리해줘야하는 것들이 많아 실행시 느림)

 

5. 사용시 주의점

    - 스트림을 재사용하면 안된다. 리턴받은 Stream 객체를 다시 스트림으로 처리하면 illegalStateException이 발생함.

    - 이터레이터를 사용하여 반복을 했을 때 빠져나올 수 없는 경우에는 무한 스트림이 생성될 수 있다. 

    - 스트림을 이용하면서 람다 또는 메서드 참조를 사용하는 경우에는 지역번수에 접근할 수 없다. final 변수만 사용 가능.

'자바 스터디' 카테고리의 다른 글

5주차 overriding, overloading + up/down casting  (0) 2024.04.11
4주차 Interface + Observer Pattern  (0) 2024.03.20
3주차 Annotation  (1) 2024.03.06
2주차 Optional  (0) 2024.03.06

스프링부트 스터디를 하면서 내 프로젝트를 만들어보고싶었다!! 

그래서 시작한 즐농 프로젝트. ㅋㅋ 

 

1. 인텔리제이에 스프링 프로젝트를 만들기.

- 내가 쓰고싶은 디펜던시들을 욕심부려서 처음부터 다 넣어놨는데 db를 연결해주지 않은채로 jpa를 넣어놔서 이런 오류가 발생했다!

얼른 주석처리 했음.

Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class

 

- mysql db연결을 했는데 계속 로그인 창이 나왔다. 처음보는 현상이고 이 전에 스터디했던 스프링부트 프로젝트 파일이 뭔가 충돌이 난건가 싶은 생각에 혼란스러웠다.. ㅋㅋ 검색해보니까  오라클 포트와 겹쳐서 그렇게 된다는 사람이 많았는데,, 난 오라클을 설치하지 않았다. 어쨋든 포트번호 문제인가 생각해서 application.properties에서 포트를 계속 변경해보았지만 똑같은 현상이 나타났다.. 다시 검색해본 결과 security가 막고있다는 것 같다. 다시 시큐리티 관련된 디팬던시들을 주석처리했다... 성공! ㅠㅠ 큰 교훈을 얻었다....

문제의 로그인 창
성공!

 

- 테스트! 포스트맨으로 post요청을 보내서 데이터를 넣어봤고 db에 잘 들어갔다.

 

 

 

2. Vue3 넣기 

- 회사에서는 vue2로 프로젝트를 진행하는데 vue2는 더이상 지원을 해주지 않는다고 해서,, 나는 vue3로 프로젝트를 진행해보려고 한다. 

  이벤트버스라던가 그런 것들이 없어졌던 것 같은데 공부하면서 진행하면 될 듯...

- vue는 프로젝트를 따로 만들어서 하지않고 src 폴더에 생성했다.

- vue는 8080/ springboot는 9000으로 포트를 변경하고 프록시 설정까지 했다.

- vue를 연동하는 과정에서 계속 웹팩 오류로 서버를 돌릴 수 없었는데, 이 오류는 웹팩 버전 문제였다. 업데이트 해주니까 성공!

vue.js 8080
springboot 9000

- 또, 한 번에 프론트와 백엔드를 빌드할 수 있도록 설정을 해주는데 계속 오류가 났다... 이때는 정말 화가 많이 났다.....

  어쨌든 검색을 해본 결과 moowork이 더이상 사용이 안되는 듯. 다른 플러그인으로 변경했다. 

 

3. git & github 연결

- 회사에서 깃을 안 써서 처음으로 깃을 연동해봤다. 이제 회사에도 깃을 연동해야겠다 하하하하하

- 프로젝트에 깃을 설정하고, 소스트리도 연동하고, 깃허브 리포짓토리도 생성해서 연동했다~!

- 이게 되는 건지 안되는건지 모르겠어서 아무 파일이나 만들어서 커밋해봤는데 다시 보니까 컨트롤러 이름을 소문자로 시작했다 ㅠㅠㅋㅋ 어쩐지 잘 된다 싶었다...

 

 

 

프로젝트 설정은 어느정도 마무리 된 것 같다 ~~!! 

 

---------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------

참고

https://deockstory.tistory.com/26

 

Vue.js + Spring boot 개발 환경 및 빌드 환경 설정

웹 페이지를 만들 때 사용자들이 조금 더 매끄럽게 서비스를 사용할 수 있도록 SPA로 만드는 경우가 많습니다. 본 블로그 포스팅은 Spring boot와 Vue js를 이용해 간단한 SPA를 개발하기 위한 개발 환

deockstory.tistory.com

https://github.com/node-gradle/gradle-node-plugin/blob/7.0.1/docs/usage.md