본문 바로가기
Spring/Spring

[inflearn/spring 입문] section.3 8-9강 정리 및 이해하기

by SIXXXX_ 2022. 2. 11.
728x90

비즈니스 요구사항 정리

 

데이터 : 회원ID, 이름

기능: 회원 등록, 조회

가상의 시나리오 : 데이터 저장소가 선정되지 않음 >> DB가 정해지지 않았음

 

Web Application 계층 구조

- Controller : 웹MVC의 컨트롤러 역할

- Service : 핵심 비즈니스 로직구현(회원중복불가 등)

- 리포지토리 : DB에 접근, 도메인 객체를 DB에 저장하고 관리

- 도메인 : 비즈니스 도메인 객체(DB에 저장되고 관리되는)

- DB : 모든 정보들 데이터화

 

 

클래스 의존관계

MemberServide → MemberRepository(interface) ← Memory MemberRepository

개발을 진행하기 위해 초기 개발 단계에서 구현체로 가벼운 메모리 기반의 데이터 저장소를 사용하고(Memory MemberRepository)

나중에 옮기기 때문에 interface를 만들어준다

 

 

```java
package welcome.welcomespring.repository;

import welcome.welcomespring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository{

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L; 

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
      return store.values().stream()
              .filter(member -> member.getName().equals(name))
              .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }
}
```

 

모르던 부분

 

1. Optional 

자바 8 이상에서부터 쓰이는 것 

Null 반환값을 Optional로 감싸서 반환해준다

 

Optional.ofNullable();

 

2. 동시성 문제-> auto increment를 사용한다

 

 

HashMap : Java Collections Framework 에 속한 구현체 클래스

Map 인터페이스 자체는 Java 5에서 Generic이 적용된 것 외에 처음 선보인 이후 변화가 없지만, HashMap 구현체는 성능을 향상시키기 위해 지속적으로 변화해 왔습니다.

 

 

HashMap & HashTable : '키에 대한 해시값을 사용해 값을 저장하고 조회하며, 키-값 쌍의 개수에 따라 동적으로 크기가 증가하는 associate array(map, dictionary, symbol table)

 

비교 HashMap HashTable
개념 Java API Java API
언제부터? Java2에서 처음 선보인 Java Collections Framework 에 속한 API JDK 1.0 부터 존재하던 Java API
구현 Map 인터페이스 구현 Map 인터페이스 구현
해시충돌방지 보조해시함수사용(Additional Hash Function) -> hash collision(해시충돌) 덜 발생(해시 함수의 표현 정수 범위보다 작은 M개의 원소가 있는 배열만을 사용한다.//Separate Chaining(자바8에서는 linked list대신 tree사용) 보조해시함수 사용X
associative array Map Dictionary
Thread Safe Thread Safe X ->외부에서 synchronized 처리필요 Thread Safe O, 데이터 관련 함수에 synchronized 키워드가 선언되어 있다.

 

Boolean같이 서로 구별되는 객체의 종류가 적거나, Integer, Long, Double 같은 Number 객체는 객체가 나타내려는 값 자체를 해시 값으로 사용할 수 있기 때문에 완전한 해시 함수 대상으로 삼을 수 있다. 하지만 String이나 POJO(plain old java object)에 대하여 완전한 해시 함수를 제작하는 것은 사실상 불가능하다.

 

 

 

3. stream()

인터페이스 4개의 메소드

  • map()
  • filter()
  • reduce()
  • collect()

 

 

4. filter()

filter 메서드는 컬렉션을 조건에 의한 선택을 할때 유용하다.
filter 메서드는 boolean 결과를 리턴하는 람다 표현식이 필요하다.
예제의 collection 메서드는 filter 표현식에 나온 값을 list로 변경한다.

Listt<String> names = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk", "Dajung");

    //java 8 Lambda
    final List<string> startsWithS = 
    names.stream().filter(name -> name.startsWith("S"))
        .collect(Collectors.toList());
    System.out.println(startsWithS);
    
    //[Sehoon, Songwoo]

 

 

5. findAny()

Stream 어떤 조건에 일치하는 요소(element) 1개를 찾을 때, findAny()와 findFirst() API 사용가능

findAny()는 Stream에서 가장 먼저 탐색되는 요소 리턴

findFirst()는 조건에 일치하는 요소들 중에서 Stream에서 순서가 가장 앞에 있는 요소를 리턴

 

 

 

 

 

6. 람다식 : 

메서드를 하나의 식(expression)으로 표현한 것.
메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로 람다식을 익명함수(anonymous function)라고도 한다.

람다 함수 : 익명함수 , Java 8버전부터 지원

int plus(int x, int y){
    return x+ y;
}
//반환타입 메서드이름 (매개변수 선언) {}

람다식으로 바꾸면

(int x, int y) -> x + y
//(매개변수 선언) -> {}

 

REFERENCE