본문 바로가기

전체보기

(124)
[Django] F Expressions 장고 공식문서를 보던 중 쿼리 표현식에서 F()라는 표현식을 보게 되었는데, 장고 초보인 나에게 어려워서 정리하는 내용.. F() 장고의 공식문서를 보면 F()를 사용하면 실제 데이터 베이스에서 Python 메모리로 가져오지 않고 모델의 필드값을 사용해 데이터베이스 작업을 수행한다. 때문에 데이터베이스 레벨에서 해당하는 쿼리를 생성한다고 한다... 처음에 이해할 때에는 어차피 get() 메소드를 사용하면 Python 객체로 불러오는데 무슨 차이인지 알지 못했고, 생성되는 쿼리를 확인하면서 이해할 수 있었다. # 여기서 사용할 간단한 모델 class Post(models.Model): title = models.CharField(max_length=200) text = models.TextField() r..
[JPA] 값 타입(Value Object) 엔티티 타입 vs 값 타입 엔티티 타입 @Entity로 정의하는 객체 식별자를 통해 지속적으로 추적이 가능해 값을 변경해도 식별자를 통해 같은 객체인지 인식 가능 생성, 소멸, 영속 등의 생명 주기가 존재 다른 객체에서 참조가 가능 값 타입 int, Integer, String 등 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 존재하기 때문에 추적이 변경시 불가능 생명주기를 엔티티에 의존. 의존하는 엔티티가 제거되면 함께 삭제 공유하지 않는 것이 안전 기본 값 타입 basic value type 기본 타입, 래퍼 클래스나 String 등을 사용한다. 값 타입의 속성은 식별자 값이 없으며, 공유를 막아야 한다. 만약 공유를 허용하면 회원의 이름을 변경할 때 다른 회원의 이름까지 변경될..
[Java] 병렬 데이터 처리(병렬 스트림, 포크/조인 프레임워크) 병렬 처리(Parallel Operation)란 멀티 코어 환경에서 하나의 작업을 분할해 각각의 코어가 병렬적으로 처리하는 것이다. 자바7 이전에는 데이터 컬렉션을 병렬 처리하기 위해서는 데이터를 분할하고 각각의 스레드로 할당 해야한다. 하지만 스레드는 경쟁 상태(race condition)가 발생할 수 있어 동기화가 필요하고, 마지막에는 각 스레드에서 발생한 부분 결과를 하나로 합치는 과정이 필요하다. 하지만 병렬 스트림과 포크/조인 프레임워크를 사용하면 쉽게 병렬 처리가 가능하다 동시성과 병렬성 둘 다 멀티 스레드의 동작 방식이라는 점은 동일하지만 목적이 다르다. 동시성(Concurrency) 멀티 작업을 위해 멀티 스레드가 번갈아가며 실행하는 성질이다. 싱글 코어 CPU를 이용한 멀티 작업은 병렬적..
[JPA] 영속성 전이(cascade)와 고아 객체 영속성 전이(transitive persistence) 특정 엔티티를 영속 상태로 만들 때, 영관된 엔티티도 함께 영속 상태로 만드는 것이다 CASCADE옵션을 사용하면 부모 엔티티를 저장할 때, 자식 엔티티도 함께 저장이 가능하다. 엔티티를 저장할 때에는 연관된 모든 엔티티가 영속상태여야하기 때문에 부모 엔티티를 저장하려면 부모 엔티티와 연관된 자식 엔티티 각각 영속 상태로 만들어야 한다. @Entity public class Parent { ... @OneToMany(mappedBy = "parent") private List children = new ArrayList(); } @Entity public class Child { ... @ManyToOne private Parent parent; }..
[JPA] 프록시, 즉시 로딩과 지연로딩 프록시 엔티티를 조회하고 항상 연관된 엔티티가 사용되는 것은 아니다. 회원을 조회했다고 해도 회원이 가입한 팀을 사용하지 않을 수도 있다. 때문에 회원을 조회할 때 항상 팀 엔티티를 함께 조회하는 것은 효율적이지 않다. JPA는 엔티티가 실제로 사용되기 전까지 데이터베이스 조회를 지연할 수 있도록 제공하는데 이를 지연 로딩이라 한다. 실제 사용하는 시점에 데이터베이스에서 필요한 데이터를 가져오는 것이다. 하지만 지연 로딩을 사용하면 실제 엔티티 객체 대신 가짜 객체가 필요한데 이것이 프록시 객체이다. 프록시 객체 JPA에서는 식별자로 엔티티를 조회할 때 EntityManager.find()를 사용하는데 이 메소드는 영속성 컨텍스트에 엔티티가 없으면 데이터베이스를 조회한다. 이렇게 조회하면 사용하지 않더라..
[Java] String.replaceAll() 활용하기 자바에서 replaceAll(regex, replacement)는 문자열에서 정규식과 일치하는 문자열을 찾아 replacement로 바꾸어주는 메소드이다. replaceAll()은 내부적으로 Matcher.appendReplacement()를 사용하는데 Matcher에서 사용했던 것과 유사하게 그룹핑을 통해 일치하는 문자열을 골라 커스텀이 가능하다. ([Java] Pattern, Matcher Class 사용법과 메소드 정리) System.out.println("abcdefg".replaceAll("\\w", "*")); // ******* 기본적으로 사용하면 String.replaceAll()을 사용한다면 위와 같은 형태로 출력이 가능하다. 주어진 \\w과 일치하는 문자열을 모두 찾아 *로 변환하는 것..
[Java] 스트림(Stream) 활용 필터링 filter filter 메소드는 Predicate를 인수로 받아 true를 반환하는 요소만을 포함하는 스트림을 반환한다 List numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .filter(i -> i % 2 == 0) .forEach(System.out::println); // 2 // 4 distinct 중복을 제거한 요소를 반환한다. 중복 여부는 객체의 hashCode(), equals() 메소드로 판별한다. List numbers = Arrays.asList(1, 1, 2, 2, 3); numbers.stream() .distinct() .forEach(System.out::println); // 1 // 2 // 3 슬라이싱 Pre..
[Java] 스트림(Stream) 스트림 스트림(Stream)은 Java8부터 추가된 컬렉션(배열 포함)의 요소를 하나씩 참조해 람다식으로 처리할 수 있도록 하는 반복자이다. 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소 List list = Arrays.asList("A", "B", "C", "D"); // 스트림 사용❌ Iterator iter = list.iterator(); while(iter.hasNext()){ String name = iter.next(); System.out.println(name); } // 스트림 사용⭕ Stream stream = list.stream(); list.stream().forEach(name -> System.out.println(name)); 특징 선언형 선언형으로 코드를 구..