210310 수 TIL

bongf·2021년 3월 10일
0

TIL

목록 보기
14/40

✔ TODO

✔ Done


🗒 Learned

1. 코드스쿼드 210306 spirng-qna 2-1 실습

  • 공개할 수 있는 부분은 여기에 너무 상세한 것은 저기에

(1-1) MVCC : 다중버전동시성제어

  • 출처 https://mangkyu.tistory.com/53
  • 동시접근을 허용하는 데이터베이스에서 동시성을 제어하기 위해, 데이터에 접근하는 사용자는 접근한 시점에서 데이터베이스의 스냅샷을 읽는다. 이 스냅샷에 대한 변경이 완료료될 때까지 만들어진 변경사항은 다른 사용자가 못보고, 사용자가 데이터를 업데이트 하면 이전 데이터를 덮어 쓰는 것이 아니라 새로운 버전의 데이터를 생성하고, 이전 버전과 비교해서 변경된 내용을 기록.
  • 참고http://www.h2database.com/html/features.html#database_url
  • 그러나 이것은 최근 버전의 h2는 MVCC는 사용안하는 것으로 정의 (기본내장)https://www.inflearn.com/questions/16222

(1-2) 에러해결

  • 상황 jdk 11버전과 jdk8을 프로젝트 별로 번갈아가며 쓰고 있었는데
  • 자바8 프로젝트에서 gradle에 implementation을
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

(1-3) h2 데이터소스경로

  • application properties에
    spring.datasource.url=jdbc:h2:tcp://localhost/~/h2DataBase/spring-qna;DB_CLOSE_DELAY=- 1;DB_CLOSE_ON_EXIT=FALSE
  • 을 추가해주는데 이것의 spring.datasource.url=jdbc:h2:tcp://localhost/~/h2DataBase/spring-qna 이것은 데이터가 저장될 경로다. 위의 경로는 홈디렉토리-user-내이름-에 있는 여러 파일중에 h2DataBase/spring-qnafh 가게된다

(1-4) DB_CLOSE_ON_EXIT=FALSE 의 의미

(1-5) DB_CLOSE_DELAY=-1 의 의미

(1-6) sa meaning

(1-7) spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

  • spring.jpa.database-platform : JPA 데이터베이스 플랫폼을 지정.
  • spring data jpa는 기본적으로 hibernate라는 jpa 구현체를 사용
  • hibernate는 내부적으로 지정되는 db에 맞게 sql문을 생성하는 dialect가 존재
  • dialect는 hibernate가 다양한 데이터베이스를 처리하기위해 각 데이터베이스에 맞는 sql문법을 처리하기 위해 존재
  • 출처 https://m.blog.naver.com/writer0713/221536526190

(1-8) http://localhost:8080/h2-console/

  • 서버를 띄우고 나서 위 주소로 들어가면 콘솔창이 뜬다

(1-9) 그러나 경로 설정 문제

(1-10) 학습내용 @Entity

  • 출처 https://www.youtube.com/watch?v=69tNvDm-iiI&list=PLqaSEyuwXkSppQAjwjXZgKkjWbFoUdNXC&index=18&t=774s
  • User클래스가 데이터베이스와 연결된다는 것을 인식시켜주기 위해서 @Entity == jpa가 관리하는 데이터다, 김영한
  • 각각의 데이터는 pk(primary key)가 있어야 함 @id로 설정
    • db가 id를 자동으로 생성해주는 것을 identity라고 합니다
  • 숫자값을 자동증가하는 방식으로 pk를 많이쓴다
    • 이 수가 자동증가하게 하려면 @GeneratedValue 자동으로1씩 증가시켜줌
  • @Column(nullable = false)로 하면 null 값이 들어갈 수 없다는 것을 의미 default=true
    • 이런식으로 각 필드마다 다양한 옵션 설정 가능

(1-11) 학습내용

  • 출처 https://www.youtube.com/watch?v=69tNvDm-iiI&list=PLqaSEyuwXkSppQAjwjXZgKkjWbFoUdNXC&index=18&t=774s
  • 아래 코드에서 이 JpaRepository가 어떤 클래스에 대한 리포짓토리냐 : User
  • 그것의 pk타입은? Long 의미다
  • UserRepositry는 내가 어딘가에서 만드는 것이 아니라 Controller?에서 있다고 생각하고 땡겨서 쓴다. 얘가 어디 있다고 생각하고 가져다가 쓰면 돼
  • 진짜 신기하네 JpaRepository를 가져다 썼기 때문에 별도의 구현 없이도 repository.save라고 쓸 수 있는겨 !

(1-12) 학습내용2 스프링데이터 JPA

  • 궁금증. 왜. interface UserRepository가 JpaRepository라는 인터페이스를 extends했는데 어떻게 사용이 가능할까? 인터페이스는 반드시 구현을 해 줘야만 사용한거 아닌가?
  • 답을 주신 김영한님. 강의출처
  • 일차답
    • 일단, exnteds인 이유. interface가 interface를 받을 때는 extends라고 한다
    • 그리고 이것은 엄밀히 말하면 스프링데이터JPA 그냥 JPA가 아니라 ( JPA를 편리하게 사용하도록 도와주는 기술)
    • JpaRepository를 받고 있으면 스프링데이터JPA가 구현체를 만들어준다.
    • 그리고 스프링 빈에 등록까지 해주기 때문에 @repository 할 필요도 없는겨
  • 이차답 : 좀 더 상세하게 보자면
    - exteNds JpaRepository한 interface를 스프링데이터JPA가 스프링 빈을 자동으로 만들어서 객체를 생성해서 스프링빈에 올려
    • 메소드구현 안해도 되는 이유 : 기본 crud에 관한 것들이 다 만들어져있어
    • 근데 이 기본 말고 내가 만약에 내가 User의 name으로 하나를 찾고 싶을 때

      이것만 써주면 돼
    • find..만 쳐도 By나오고..Name나오잖아.이게 규칙이 있는 거야. sql로 짜서 번역이 된다

(1-13) 학습 : ModelandView

(1-14) 학습 : JpaRepostiory save() to update the instance

MerchandiseEntity pantsInDB = repo.findById(pantsId).get(); 
pantsInDB.setPrice(44.99); 
repo.save(pantsInDB);

(1-15) 학습 REST API

  • 출처 : https://www.youtube.com/watch?v=V2AhIjdfcMg
  • html에서는 get, post방식만 지원 하지만 put delete 등 더 다양한 http 메서드 존재
  • user정보 업데이트에 어떻게 put을 쓸 수 없을까? 더 의미가 정확하잖아. put~ users/1/이런식. 정보를 수정하는 것
  • 꼼수가 있어. 꼼수지만 표준화된 꼼수
    • form태그 작성한 밑에
    •  <input type="hidden" name="_method" value="PUT" />
    • 로 작성한다.
  • REST API

(1-16) 디미터 법칙

  • 팀 코드리뷰 중에 디미터 법칙을 알게되었다.
  • 원래 내코드
  • 그런데 이것은 UserService에서 일어나는 일이기 때문에 사실 User객체의 메소드를 가져와서 수정하고 하는 일은 User에서 해주는 것이 맞다
  • 우디가 첨부해준 링크
    • 객체 구조의 경로를 따라 멀리 떨어져 있는 낯선 객체에 메시지보내기 피하기
    • 내부적으로 보유한 메시지 통해 확보한 정보만 가지고 의사결정을 내리자
    • 다른 객체를 탐색해서 얻은 정보로 의사결정을 내리지 말자
  • 원래 내 코드에서 UserServie는 User를 탐색해서 얻은 정보로 의사 결정을 내리고 있다.
  • 변경 후 코드
    • 그리고 이렇게 User객체에 메서드를 추가했다.

(1-17) CrudRepository vs JpaRepository interfaces in Spring Data JPA

  • 출처 https://stackoverflow.com/questions/14014086/what-is-difference-between-crudrepository-and-jparepository-interfaces-in-spring

  • JpaRepository는 PagingAndSortingRepository를 상속하고 PagingAndSortingRepository는 CrudRepository를 상속

  • JpaRepository는 CrudRepository에 (PagingAndSortingRepository기능인)페이징과 sorring records(어떤 기능인지 모르겠다) 에 더하여 JPA관련 메소드들을 제공한다. 필요한 과정에 따라 사용하면 될 것 같다.

  • 실행해보니 CrudRepository의 findAll()결과는 Iterable\<> 인 것에 반해 JpaRepository는 findAll()은 List<>를 반환

    • Iteralbe을 List로 변환하기

      • 출처 https://www.baeldung.com/java-iterable-to-collection

      •     @Test
            public void whenConvertIterableToListUsingJava8_thenSuccess() {
                List<String> result = new ArrayList<String>();
                iterable.forEach(result::add);
        
                assertThat(result, contains("john", "tom", "jane"));
            }
      • html에서 for문 돌 때 Iterable도 가능

(1-18) findOne(findById) vs getOne 차이

  • 왜학습? 미션 조건에 findOne을 쓰란 말이 잇어서 혹시 이것이 getOne을 의미하나 의심
  • 프록시나 트랜잰셕을 잘 몰라 아직 잘 모르지만, 대략적으로 getOne이 null일시 예외 발생 데이터를 직접 가져오지 않고 프록시 객체를 생성하여(껍데기) 참조만 가져오기 때문에 .. (나중에 이 껍데기에 데이터가 실제로 필요하면 프록시에 채워줄 수 있어) 성능이 더 좋고 객체의 속성에 엑세스 할 필요 없을 때 유용하다.
  • 둘의차이
    • getOne은 엔티티에 대한 참조를 반환(프록시반환), 비어있을시 예외 발생
    • findOne은 엔티티를 실제로드, 비어있을시 null반환
  • 출처 https://yongdev.tistory.com/137
  • 출처 https://granger.tistory.com/50

📂 Feeling

  • 미션을 하면서 스프링에 대한 개념을들 조각모음하고 있다. 재밌다.

Good

  • 잘 이해 안가는 개념은 조금 넘기는 습관이 생겼다. 현재 수준에서 커버칠 수 없는 부분까지 이해하려고 애쓰다가 시간을 너무 낭비하는 경향이 있었다. 그래서 적정 수준에서 궁금증만 해소하는 수준에서 넘어가고자 했는데 오늘도 그랬기 때문에 미션2를 거의 달성할 수 있을 것 같다.

Bad

profile
spring, java학습

0개의 댓글