TIL 2021.05.27

Kyu·2021년 5월 27일
0

TIL

목록 보기
137/322

JDBCTemplate

프로젝트

위시리스트 추가 API

User의 속성값으로있는 위시리스트에 새로 들어오는 hotel_id값을 추가하기위해서

  1. 원래 가지고 있던 User의 String wishList을 List으로 먼저 변환해주고,
  2. 새로들어오는 hotel_id값을 그 리스트에 add(hotel_id)한다.
  3. 다시 그 리스트를 String으로 변환해서 User의 wish_list컬럼을 update한다

3번 과정할땐 WishListDTO 에 List wishList에 넣어주고 DTO와 DAO가 통신하도록 한다.
가 아니라 Entity와 DAO가 통신하도록 데이터 처리해줘야할건 DTO까지 전부해주고 Entity로 변환해준다.

2번 과정에서 문제 발생

java.lang.UnsupportedOperationException: null
	at java.util.AbstractList.add(AbstractList.java:148) ~[na:1.8.0_275]
	at java.util.AbstractList.add(AbstractList.java:108) ~[na:1.8.0_275]
	at com.team03.airbnb.service.UserService.addNewWishToList(UserService.java:29) ~[main/:na]

참고: https://stackoverflow.com/questions/5755477/java-list-add-unsupportedoperationexception

해결: List wishList로 받은 것을 wishList = new ArrayList<>(wishList); ArrayList로 다시 만들어줌

아래는 3번 과정에서 다시 String으로 변환해주는 로직인데,

    public static String listToString(List<?> list) {
        String result = "";
        for (int i = 0; i < list.size(); i++) {
            if (i == 0) {
                result += list.get(i);
            } else {
                result += ", " + list.get(i);
            }
        }
        return result;
    }

괜찮은걸까?

삭제 API

추가 API 구현과 똑같이 해줬다.

  1. 먼저 String으로 되어있는 wish_list를 List으로 변환
  2. hotelId와 일치하는 인덱스를 찾아서 remove(인덱스)
  3. 그 List를 다시 String으로 변환해서 wish_list컬럼을 update

코드: https://github.com/kyu-kim-kr/airbnb/pull/57

Transaction

테이블보다 작은단위 로우,컬럼,페이지,특정메모리영역 등등에 락을 걸수있다.
자바로치면 오브젝트 필드하나에 락을 하는거다.
왜 이렇게 락을 세분화하나?
최적화하려면 작은단위까지 지원해야해서.

성질

ACID

A: 원자성: 완벽하게 실행하거나 혹은 전혀 실행하지 않는 트랜잭션을 필요로 한다

C: 일관성: 트랜잭션이 커밋되면 데이터가 데이터베이스 스키마를 준수하도록 요구한다.

NoSQL의 Consistency랑 다르다. NoSQL은 Eventual Consistency..명령어를 실행했을때 해당하는 오퍼레이션이 수행하고나서 다른사람이 그결과를 요청했을때 모두에게 늘똒같은 결과를 보장해주는게 consistency
예를들어서 업로드함과 동시에 주소가 생기는데 모두가 읽을수있으면 consistency가 -> 있다
그리고 파이로가 업로드하고 새리는 다운로드되는데 JAne은 안된다 -> 없다
Eventual Consistency는 파이로가 업로드햇는데 어느순간에 모든사람이 읽을수있느데 그 순간을 모를때.

I: Isolation: 트랜잭션은 방해받지않고 나혼자 실행하는되는것을 보장해야한다
D: Durability: 내구성: 한번 레코드된 건 영구적으로 저장되어야한다는 것을 보장.

자바로는 이걸못하는거니까 관계형데이터베이스를 쓴다.

키워드들

  • CAP 이론

분산시스템이 갖춰야하는 조건
Consistency, Availability, Partition Tolerence 셋모두 만족시키는 시스템은 구현할 수 없다.

많은 NoSQL은 일관성을 포기함.
AWS S3 가용성이 99.9999%, 그리고 서버하나가 죽어도 다른서버가 다 백업해주는걸 생각해보면된다.

  • NoSQL의 특성
    BASE!! <-> ACID

  • Serial Schedule

  • Serializable

profile
TIL 남기는 공간입니다

0개의 댓글