본문 바로가기

왜?5

[왜] 스프링부트 테스트에서 repository save()가 반환하는 객체를 사용해야 할까? 궁금증 인프런 - 스프링 부트 개념과 활용(백기선)에서 스프링 데이터 6부 : 스프링 데이터 JPA 연동을 듣다가 생긴 호기심이다. @DataJpaTest에서 엔티티 객체를 생성하여 save()했는데 왜 반환된 객체를 새로운 참조 변수에 담아 그를 테스트하는지 궁금했다. 해결 save() save()는 엔티티의 상태가 어떻든 저장한다. 엔티티를 새로 저장할 수도 있고, 기존 엔티티를 새로운 엔티티와 병합할 수도 있다. 병합 시 동일한 id에 연결된 엔티티에 상태를 복사하고 그 엔티티를 반환한다. save()로 새로 저장하는 경우에는 Account와 newAccount가 동일한 객체다. 하지만, merge하는 경우엔 다른 인스턴스일 것이다. 반환된 인스턴스를 사용하지 않으면, 분리된 엔티티(detached.. 2020. 5. 11.
[왜] 스프링부트의 repository는 클래스가 아니라 인터페이스일까? 설명 Spring Data JPA는 구현체 클래스를 제공한다. 즉, 구현 객체를 동적으로 생성해서 주입하게 된다. Entity 타입과 PK 타입을 repository 인터페이스에서 제공하기만 한다면, Spring Data JPA가 기본적인 CRUD 메소드를 만들어 준다. 메소드 이름을 파싱해서 적절한 쿼리를 만든다. 예컨대 'find', 'by', 'distinct'와 같은 키워드들을 말이다. 게다가 쿼리를 위한 DSL도 가지고 있다. (Querydsl) QueryDsl은 Type-Safe한 쿼리를 위한 스프링에서 제공하는 Domain Specific Language SQL같이 문자로 Type Check가 불가능하고, 실행하기 전까지 작동 여부를 확인 하기 어려운 부분을 보완하여 SQL을 Java로 Ty.. 2020. 5. 11.
[왜] gradle은 다운로드한 의존성 파일(jar)을 해당 프로젝트에 보관하지 않을까? 문제상황 jquery webJar를 의존성으로 추가하고, 해당 라이브러리의 폴더 구조가 어떻게 되있는지 알고 싶었다. 그런데 로컬에서 프로젝트 디렉토리를 탐색하면, 라이브러리(jar파일) 폴더는 보이지 않았다. gradle을 통해 의존성을 추가하고 빌드하면, 해당 프로젝트에서 라이브러리를 사용할 수 있음에도 불구하고! 대체 왜 그럴까? 이유 바로 로컬 캐시 때문이다. 다른 프로젝트에서 동일한 의존성을 추가하고 빌드 시, 해당 라이브러리를 저장소에서 또 다운로드 받는 건 비효율적이다. 따라서 특정 경로에 의존성들을 다운로드 받아놓고, 버전이 같은 경우 다시 다운로드하지 않는다. 해쉬값으로 디렉토리 이름이 저장된다. 해당 라이브러리의 오염을 체크하는 것?! (정확하진 않음) 의존성 다운로드 경로는 /.gra.. 2020. 4. 25.
[왜] synchronized block은 오버헤드를 증가시킬까? synchronized란? 메소드나 블록 코드에 동기화 영역을 표시 동기화 블록은 한 시점에, 1개의 쓰레드만이 접근 가능 블록에 접근을 시도하는 다른 쓰레드들은 블록 안 쓰레드가 실행을 마치고 블록을 벗어날 때까지 블록(blocked) 상태 즉, 멀티스레드의 동시접근을 방지 사용처 메소드 method에 synchronized를 걸 경우, 그 함수가 포함된 객체에 lock을 거는 것 코드블록 synchronizd method synchronized instance method 인스턴스 메소드 동기화 메소드를 가진 인스턴스 기준으로 lock 호출하는 인스턴스가 같다면, 1개 쓰레드가 1번 instanec method를 수행할 때, 나머지 쓰레드는 모든 instance method를 수행할 수 없다. 호출하.. 2020. 4. 19.
[왜] 로그 찍을 때 System.out.println을 사용하면 안 좋을까? System.out.println 이란? java.lang.System Among the facilities provided by the System class are standard input, standard output, and error output streams; access to externally defined properties and environment variables; a means of loading files and libraries; and a utility method for quickly copying a portion of an array. (해석) System class에 의해 제공되는 기능에는 표준입력, 표준출력, 에러출력스트림, 외부 프로퍼티와 환경변수에 대한 접근,.. 2020. 4. 18.