Java/공부

자바 공부

Frankie 2022. 9. 12. 22:45

[1] 코드스테이츠 커리큘럼 참조

 

1. OOP 기초(Java 언어의 클래스와 객체 이해 OOP 적용)

 

2. OOP 심화(객체지향의 원리와 설계 구현)

 

3. Collection 프레임워크(List, Set, Queue, Map)

 

- List: 순서가 있는 데이터의 집합, 중복 허용.

 

import java.util.ArrayList;

 

class Test {

        public static void main (String[] args) {

               ArrayList<Integer> marks = new ArrayList<>();

              

               marks.add(50);

               marks.add(60);

               marks.add(40);

               marks.add(70);

              

               System.out.println(marks);

        }

}

 

- Set: 순서가 없는 데이터의 집합, 중복 허용 x.

 

void hashSetTest() {

    Set<Integer> hashSet = new HashSet<>();

    hashSet.add(10);

    hashSet.add(20);

    hashSet.add(30);

    hashSet.add(10); // 중복된 추가

 

    assertEquals(3, hashSet.size());

    assertEquals("[20, 10, 30]", hashSet.toString()); // 순서가 없음

}

 

- Queue: 순서가 있는 데이터를 기반으로 선입선출의 구조.

 

import java.util.PriorityQueue;

 

class Main {

    public static void main(String[] args) {

 

        PriorityQueue<Integer> numbers = new PriorityQueue<>();

 

        numbers.add(4);

        numbers.add(2);

        System.out.println("PriorityQueue: " + numbers);

 

        // Using the offer() method

        numbers.offer(1);

        System.out.println("Updated PriorityQueue: " + numbers);

    }

}

 

- Map: 키와 값의 쌍으로 이루어지는 데이터의 집합, 순서 x. 키는 중복 허용 안되지만 값은 허용.

 

import java.util.HashMap;

 

class Main {

  public static void main(String[] args) {

    HashMap<Integer, String> languages = new HashMap<>();

 

    languages.put(1, "Java");

    languages.put(2, "Python");

    languages.put(3, "JavaScript");

    System.out.println("HashMap: " + languages);

 

    // return set view of keys

    // using keySet()

    System.out.println("Keys: " + languages.keySet());

 

    // return set view of values

    // using values()

    System.out.println("Values: " + languages.values());

 

    // return set view of key/value pairs

    // using entrySet()

    System.out.println("Key/Value mappings: " + languages.entrySet());

  }

}

 

4. Effective(Enum, Annotation, Generic )

 

5. Fraework 라이브러리의 차이점과 필요성

 

6. DI IOC

 

7. API 계층의 의미, DTO 클래스의 데이터 유효성 검증

 

8. 비즈니스 계층 의미와 비즈니스 계층에서 DI 어떻게 활용하는지

 

9. 비즈니스 로직에서 발생하는 예외 처리 비즈니스 계층에서 던져진 예외를 API 계층에서 어떻게 처리하는지

 

예외 상황을 두 가지로 분리

 

(1) 비즈니스 로직에 대한 예외 -> 닉네임 중복, 이메일 중복 등

(2) 기술적인 예외(jwt, db) -> 이미 자바에서 예외를 제공

 

오류 3가지

1) error: 프로그램 밖에서 발생, 런타임 시 발생, 예외 발생 시 프로그램 멈춤, 메모리/IO 예외

 

2) checked exception: 예외처리 필수(try/catch, throws), 컴파일시 체크 가능, 예외 발생 시 트랜잭션 롤백 x

 

3) unchecked exception, RuntimeException: 예외처리 안해도 됨, 런타임 시 발생, 예외 발생시 트랜잭션 롤백

 

@ExceptionHandler: 특정한 컨트롤러에 예외처리할 때 사용하는 어노테이션. 이 때 발생한 예외는 ExceptionHandlerExceptionResolver에 의해 처리

 

* Dispatcher Servlet에는 DI로 확장 가능한 여러 전략이 있는데 그 중에 Exception 관련 Resolver도 있다. 예외 발생 시 Dispatcher Servlet이 이 예외 관련 Resolver에게 예외 처리를 위임.

 

@ControllerAdvice: ExceptionHandler는 특정 컨트롤러에만 예외 처리되므로 다른 컨트롤러에서도 중복된 에러 처리 코드가 있을 수 있다. 이 어노테이션은 여러 컨트롤러에 대해 전역적으로 ExceptionHandler를 적용할 수 있게 해준다. AOP

방식으로 동작해서 예외를 처리

 

* 주의 사항은 한 프로젝트 당 하나의 ControllerAdvice만 관리. 여러 ControllerAdvice가 필요하면 basePackages나 annotations 등을 지정해야 한다.

 

스프링의 예외 처리 흐름

 

1) 컨트롤러 안에 있는 @ExceptionHandler가 있는지 검사

2) @ControllerAdvice를 찾고 안에 @ExceptionHandler가 있는지 검사

3) @ControllerAdvice를 찾고 안에 @ResponseStatus가 있는지 검사

 

Business Exception 상속하게 한 이유 - ControllerAdvice에서 BusinessException 하나만 handler를 두면, 통일감 있는 비즈니스 예외를 처리할 수 있다.

 

10. JDBC 기반 데이터 액세스 계층(도메인 모델의 개념 학습 JDBC 기반의 엔티티의 모델 작성법 학습)

 

JDBC: 자바 어플리케이션의 코드레벨에서 사용하는 데이터를 DB에 저장 및 업데이트하거나 반대로 DB에 저장된 데이터를 자바 어플리케이션의 코드 레벨에서 사용할 수 있도록 해주는 자바 제공 표준 API(Oracle, MS SQL, MySQL 등의 DB와 연동 가능)

 

자바 어플리케이션 -> JDBC API -> JDBC 드라이버(DB와 통신 담당하는 Interface) -> DB

 

11. JPA 기반 데이터 액세스 계층(JPA 특징과 동작 방식, ORM 학습)

 

12. 트랜잭션(Spring Framework에서의 트랜잭션과 PSA 관계를 학습)

 

 

 

13. 테스트가 필요한 이유와 Slice Test 의미, API 계층과 데이터 액세스 계층을 Slice Testing 하는 방법을 학습

 

14. Spring RestDocs 이용해 REST API 문서 자동화 방법 학습

 

15. Spring Boot 기반의 애플리케이션을 빌드하고 실행

 

16. Spring Security 동작 방식 기본적인 설정

 

17. JWT 개념과 사용하는 이유, 방법

 

18. OAuth2 개념과 사용하는 방법

 

19. 온프레미스와 클라우드 환경에 대해 학습 배포

 

20. 서비스 배포 과정을 이해하고 컨테이너를 사용한 배포를 실습

 

21. 배포 자동화의 로직 학습, 애플리케이션 배포 자동화 실습

 

22. 실무 환경의 트래픽 분산, 로드밸런서 서비스 운영 전략에 대해 학습

 

[Spring WebFlux]

 

1. 리액티브 프로그래밍의 개념과 Non-Blocking 통신에 대해 학습

 

2. 리액티브 프로그래밍 구현체인 Project Reactor 기본 동작 방식에 대해 학습

 

3. 애플리케이션에 Spring WebFlux 적용

 

 

[2] 인프런 강의 참조

 

1. ObjectMapper: JSON 형식을 사용할 때, 응답들을 직렬화(Java Object -> String)하고, 요청들을 역직렬화(String -> Java Object)할 때 사용하는 기술

* spring-boot-starter-web에 기본적으로 Jackson 라이브러리 존재

* @RestController의 경우, 요청과 응답이 내부적으로 직렬화/역직렬화가 되는데 이는 Jackson 라이브러리가 있기 때문

@Getter // Object -> String 문자열로 바꿀 때 필요
class Car{
	private String name;
    private String color;
    
    public Car(string name, string color){
    	this.name = name;
        this.color = color;
    }
    
    public Car() { // String 문자열 -> Object로 바꿀 때 필요
    	this.name = null;
        this.color = null;
    }
}

Object -> String 문자열

ObjectMapper mapper = new ObjectMapper();
Car car = new Car("Celtos", "gray");

String json = mapper.WriteValueAsString(car); // {"name": "Celtos", "color": "gray"}

String 문자열 -> Object

Car carObjeect = mapper.readValue(text, Car.class); // Car{name='Celtos',color='gray'}

 

2. Builder 패턴

 

- 생성 패턴 하나로 동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는 방법.

- 객체를 생성하는 클래스와 표현하는 클래스를 분리하여 동일한 절차에서도 서로 다른 표현을 생성하는 방법을 제공

-> 생성자만 사용할 발생할 있는 문제를 개선하기 위해 고안

 

장점

- 필요한 데이터만 설정 가능(Hero 객체 생성 시 Armor 필드가 필요 없는 상황이면 

- 유연성을 확보할 수 있음(Hero 객체에 age 필드 추가해야 되는데, 이미 생성자로 객체를 만드는 코드가 있을 시, 새로 추가되는 변수 때문에 기존의 코드 수정해야하는 상황에 직면 -> 하지만 빌더 패턴 이용하면 기존 코드에 영향 안줄수 있음)

- 가독성 향상

- 불변성 확보(Setter를 구현하는 것은 편하다는 장점이 있지만 불필요하게 확장 가능성을 열어두는 것)

-> 이는 Open-Closed 법칙에 위배되고, 불필요한 코드 리딩 등을 유발 그래서 클래스 변수를 final로 선언하고 객체의 생성은 빌더에 맡기는 것이 좋다.

'Java > 공부' 카테고리의 다른 글

백엔드 개발자 자바, 스프링 질문 완전정복  (0) 2022.09.12
[디자인 패턴] 팩토리 메소드 패턴  (0) 2022.06.16
SpringBoot 구조 정리  (0) 2022.04.04