최신글
-
Django
[Django] F Expressions
장고 공식문서를 보던 중 쿼리 표현식에서 F()라는 표현식을 보게 되었는데, 장고 초보인 나에게 어려워서 정리하는 내용.. F() 장고의 공식문서를 보면 F()를 사용하면 실제 데이터 베이스에서 Python 메모리로 가져오지 않고 모델의 필드값을 사용해 데이터베이스 작업을 수행한다. 때문에 데이터베이스 레벨에서 해당하는 쿼리를 생성한다고 한다... 처음에 이해할 때에는 어차피 get() 메소드를 사용하면 Python 객체로 불러오는데 무슨 차이인지 알지 못했고, 생성되는 쿼리를 확인하면서 이해할 수 있었다. # 여기서 사용할 간단한 모델 class Post(models.Model): title = models.CharField(max_length=200) text = models.TextField() r..
-
JPA
[JPA] 값 타입(Value Object)
엔티티 타입 vs 값 타입 엔티티 타입 @Entity로 정의하는 객체 식별자를 통해 지속적으로 추적이 가능해 값을 변경해도 식별자를 통해 같은 객체인지 인식 가능 생성, 소멸, 영속 등의 생명 주기가 존재 다른 객체에서 참조가 가능 값 타입 int, Integer, String 등 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 존재하기 때문에 추적이 변경시 불가능 생명주기를 엔티티에 의존. 의존하는 엔티티가 제거되면 함께 삭제 공유하지 않는 것이 안전 기본 값 타입 basic value type 기본 타입, 래퍼 클래스나 String 등을 사용한다. 값 타입의 속성은 식별자 값이 없으며, 공유를 막아야 한다. 만약 공유를 허용하면 회원의 이름을 변경할 때 다른 회원의 이름까지 변경될..
-
Java
[Java] 병렬 데이터 처리(병렬 스트림, 포크/조인 프레임워크)
병렬 처리(Parallel Operation)란 멀티 코어 환경에서 하나의 작업을 분할해 각각의 코어가 병렬적으로 처리하는 것이다. 자바7 이전에는 데이터 컬렉션을 병렬 처리하기 위해서는 데이터를 분할하고 각각의 스레드로 할당 해야한다. 하지만 스레드는 경쟁 상태(race condition)가 발생할 수 있어 동기화가 필요하고, 마지막에는 각 스레드에서 발생한 부분 결과를 하나로 합치는 과정이 필요하다. 하지만 병렬 스트림과 포크/조인 프레임워크를 사용하면 쉽게 병렬 처리가 가능하다 동시성과 병렬성 둘 다 멀티 스레드의 동작 방식이라는 점은 동일하지만 목적이 다르다. 동시성(Concurrency) 멀티 작업을 위해 멀티 스레드가 번갈아가며 실행하는 성질이다. 싱글 코어 CPU를 이용한 멀티 작업은 병렬적..
-
JPA
[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는 엔티티가 실제로 사용되기 전까지 데이터베이스 조회를 지연할 수 있도록 제공하는데 이를 지연 로딩이라 한다. 실제 사용하는 시점에 데이터베이스에서 필요한 데이터를 가져오는 것이다. 하지만 지연 로딩을 사용하면 실제 엔티티 객체 대신 가짜 객체가 필요한데 이것이 프록시 객체이다. 프록시 객체 JPA에서는 식별자로 엔티티를 조회할 때 EntityManager.find()를 사용하는데 이 메소드는 영속성 컨텍스트에 엔티티가 없으면 데이터베이스를 조회한다. 이렇게 조회하면 사용하지 않더라..
-
Java
[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
[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
[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)); 특징 선언형 선언형으로 코드를 구..
-
백준
[백준] 10986번: 나머지 합 - JAVA
🔗 문제 링크 BOJ 10986번: 나머지 합 10986번: 나머지 합 수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) www.acmicpc.net 📝 풀이 과정 연속된 구간의 합이기 때문에 누적합 방법으로 문제를 풀이해야 한다. 배열의 연속 구간의 합은 $sum[j] - sum[i]$로 구할 수 있는데, 이 합의 M으로 나눈 나머지가 0인 순서쌍을 구해야 한다. $(sum[j] - sum[i]) \% M = 0$이 되고, 모듈러 연산은 분배가 가능하기 때문에 $sum[j]\%M - sum[i]\%M = 0$ 따라서..
-
Java
[Java] 람다(lambda)
람다(lambda)란? 람다 표현식은 메서드로 전달할 수 있는 익명 함수(anonymous function)을 생성하기 위한 식이다. 매개 변수를 가진 코드 블럭이지만 런타임시에는 익명 구현 객체를 생성한다 // 인터페이스의 익명 구현 객체 Runnable runnable = new Runnable() { public void run() { ... } } // 람다식 Runnable runnable = () -> { ... }; 인터페이스 변수명 = 람다식; 자바는 메소드만 단독으로 생성이 불가능하고 항상 클래스의 구성 멤버로 선언해야 한다. 따라서 람다는 메소드를 선언하는 것이 아닌 메소드를 가진 익명 구현 클래스를 생성하는 것이다. 람다식은 인터페이스 변수에 대입하고 대입될 인터페이스에 따라 작성법이..
-
Java
[Java] Boxing, Unboxing
자바는 참조형(Refernce Type)이거나 기본형(Primitive Type)이다. 하지만 제네릭 타입은 참조형만 사용이 가능하기 때문에 자바에서는 기본형을 참조형으로 변환하는 기능을 제공해준다. 이러한 기능을 박싱(boxing), 반대를 언박싱(unboxing)이라고 한다. Prmitive Type==== boxing =====>Wrapper Type Integer Integer number = new Integer(100); int sum = 10 + number; // Integer -> int 하지만 이러한 변환 과정은 비용이 소모된다. 또한 박싱된 값은 Heap영역에 저장되기 때문에 보다 많은 메모리를 소모하고 가져올 때에도 메모리 탐색 과정이 필요하다.
-
JPA
[JPA] Entity 생명주기(Entity LifeCycle)
엔티티 생명주기(Entity LifeCycle) 비영속(new/transient) 순수한 객체 상태이며, 영속성 컨텍스트와 관련이 없는 상태 Member member = new Member(); 영속(managed) EntityManager를 통해 엔티티를 영속성 컨텍스트에 저장되어 영속성 컨텍스트가 관리하는 상태 em.persist(member); // 객체 저장 준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된(detached) 상태 em.detach(member); // 특정 엔티티를 분리 em.close(); // 영속성 컨텍스트 닫기 em.clear(); // 영속성 컨텍스트 초기화 추가 설명 삭제(removed) 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한 상태 em.remo..
-
JPA
[JPA] 플러시(flush)
플러시(flush) 플러시는 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것 플러시를 한다고 commit이 이루어지는 것이 아니다! 동작 과정 변경 감지를 동작해 영속성 컨텍스트의 모든 엔티티를 스냅샷과 비교해 수정된 엔티티를 찾음(Dirty Checking) 수정된 엔티티는 쿼리를 만들어 쿼리를 저장 저장된 쿼리를 DB에 전송 플러시하는 방법 직접 호출 em.flush(); 영속성 컨텍스트를 강제로 플러시한다. 플러시를 하더라도 1차 캐시에 있는 내용은 지워지지 않고 저장된 쿼리만 DB에 전송하게 된다 커밋시 자동 호출 JPA가 트랜잭션을 커밋할 때 플러시를 자동으로 호출해 변경 내용을 반영하게 된다 JPQL 쿼리 실행시 자동 호출 Member member = new Member(); em.persi..
-
JPA
[JPA] 영속성 컨텍스트(Persistence Context)
EntityManagerFactory & EntityManager EntityManagerFactory 말 그대로의 Entity Manger를 만드는 공장이다 데이터베이스를 하나만 사용한다면 한개의 EntityManagerFactory를 생성한다. 스레드에 안전하기 때문에 서로 다른 스레드간의 공유를 해도 문제가 없고 생성하는데의 비용이 크기 때문에 Application 로딩 시점에 생성해 공유하도록 설계되어 있다. ... EntityManagerFactory emf = Persistence.createEntityManagerFactory("mydatabase"); // EntityManagerFactory 생성 emf.close(); // EntityManagerFactory 종료 EntityManag..
-
JPA
[JPA] JPA란? JPA를 사용하는 이유
자바는 JDBC API를 사용해 SQL을 데이터 베이스에 전달하기 때문에 중요하지만 SQL 중심적인 개발을 하게 되면 많은 문제가 발생한다. JPA Java persistence API는 자바의 ORM 기술의 표준이다 ORM❓ Object-Relational Mapping 객체와 관계형 데이터베이스를 매핑한다는 뜻 ORM 프레임워크는 객체와 테이블을 매핑해 패러다임의 불일치를 개발자 대신 해결해준다. 객체는 객체대로 생성하고, 데이터베이스는 데이터베이스에 맞도록 설계를 가능하게 해준다. 개발자는 이를 매핑하는 방법만 전달해주면 된다. JPA란 자바 ORM에 대한 API 표준 명세이고, 인터페이스의 모음이다. 따라서 구현체가 없고, 사용하기 위해서는 ORM프레임워크를 선택해야한다. 다양한 프레임워크가 존재..