분류 전체보기 94

토스증권 실시간 시세 적용기 (정리)

토스ㅣSLASH 22 - 토스증권 실시간 시세 적용기 토스증권은 인생 첫 주식거래 때 사용했던 어플리케이션이다. 마침 토스 유튜브 채널 Slash22에서 박성우[토스 Server Developer] 님께서 실시간 시세 적용기에 대한 설명을 해주셔서 내용을 정리해보기로 했다. 평소 궁금했던 토스증권 어플리케이션의 원활한 작동을 위한 아키텍쳐와 프로세스에 대해서 이해하려고 노력했다. 모르는 용어는 중간중간 Chat GPT를 활용해 정리해 두었다. 실시간 시세 투자자들은 가능한 최신 가격으로 거래하기를 희망한다. (시세와 주문호가 기준) 증권사는 실시간 시세를 제공받아 해당 기능 구현하는데 사용한다. 국내 종목의 경우 모든 증권사에서 무료로 제공되고 있지만 해외 종목의 경우 사정이 다르다. API Pollin..

[Finance] 2023.04.18

@Builder.Default

warning: @Builder will ignore the initializing expression entirely.프로젝트를 진행하던 도중 위와같은 경고를 마주치게 되었다 (에러는 아니다). 그리고 이어서 다음 조언들이 적혀 있었다.If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.@Builder 어노테이션의 Default 옵션을 사용하라는 말인데, 이를 이해하기 위해서 @Builder 어노테이션의 성질을 이해할 필요가 있었다. 생성자를 사용할 때에는 객체를 생성할 때 ..

Builder 패턴과 @Builder 어노테이션

프로젝트를 진행하면서 Builder 패턴의 유용함을 더욱 체감 중이다.예를 들어 다음과 같은 클래스 Person이 있다고 하자.public class Person { private String name; private int age; private String address; private String phoneNumber; private String email; private String job;}  Builder 패턴을 사용하지 않았을 경우 필요에 따라 다음과 같이 수많은 생성자들이 있어야 한다.public Person(String name, int age) { this.name = name; this.age = age;}public Person(String..

기본 키 매핑

기본 키 매핑 어노테이션 @Id 기본키를 직접 할당하는 방법 ⇒ @Id만 사용하면 된다. @GeneratedValue 기본키 자동생성 기능을 위해서 사용한다. IDENTITY 전략 기본 키 생성을 DB에 위임한다. MySQL(AUTO_ INCREMENT), PostgreSQL, SQL Server, DB2에서 사용한다. 보통 JPA는 커밋 직전에 INSERT 쿼리를 실행하지만, IDENTITY 전략은 entityManager.persist() 시점에 즉시 INSERT쿼리를 실행하고 DB에서 식별자를 조회한다. 그 이유는 아래와 같다. PK값을 DB에 들어간 뒤에 알 수 있다. JPA 입장에서는 @Id(DB PK)를 알 수가 없으니 원래라면 1차캐시 안에 값을 넣을 수가 없다. 그래서 commit하는 시점..

필드와 컬럼 매핑

매핑 어노테이션 정리 @Column : 컬럼 매핑 @Temporal : 날짜 타입 매핑 @Enumerated : enum 타입 매핑 @Lob : BLOB, CLOB 매핑 @Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시), DB랑 관계 없이 메모리에서만 사용한다. @Enumerated 자바 enum 타입을 매핑할 때 사용한다. 기본값은 EnumType.ORDINAL 인데, 이 떄 주의사항이 있다. ORDINAL은 0부터 시작하는 enum 순서를 DB에 저장하므로(Integer) 자바 enum타입을 매핑하기 위해 사용하려면 ORDINAL을 사용하면 안된다. enum 타입인 ROLETYPE에 순서 변화가 발생했을 때, 이전의 데이터들에게 영향을 미쳐 큰 문제가 발생하는 등 여러 곤란한 상황..

데이터베이스 스키마 자동 생성

JPA에서 애플리케이션 로딩 시점에 CREATE 쿼리로 DB 테이블을 생성하는 기능도 지원해준다. 생성된 DDL은 운영단계에서는 사용하면 곤란하다.. 보통은 개발단계나 로컬 PC에서 개발할 때 사용한다. 객체 매핑을 다 해 놓으면 테이블이 생성되므로 객체 중심적인 개발이 가능하다. DB 방언을 활용해서 DB에 맞는 적절한 DDL을 생성한다. DB 스키마 자동 생성 - 속성 create 기존 테이블을 삭제 후 다시 생성한다. DROP + CREATE create-drop create와 같지만, 종료시점에 테이블을 DROP한다. update 변경분만 반영한다. 운영DB에서는 사용하면 안된다. 보통은 애플리케이션 코드에서 필요한 업데이트를 수행하도록 구현한다. validate 엔티티와 테이블이 정상 매핑되었는..

객체와 테이블 매핑

엔티티 매핑 소개 객체와 테이블 매핑 ⇒ @Entity, @Table 필드와 컬럼 매핑 ⇒ @Column 기본 키 매핑 ⇒ @Id 연관관계 매핑 ⇒ @ManyToOne, (…) , @JoinColumn 객체와 테이블 매핑 @Entity @Entity 어노테이션이 붙은 클래스는 JPA에 의해 관리되고, 엔티티라고 한다. 기본 생성자가 필수이다. (파라미터 없는 public 혹은 protected) final 클래스 ,enum, interface, inner 클래스 사용할 수 없다. 저장할 필드에 final을 사용할 수 없다. name 속성 기본값은 클래스 이름과 같다. 다른 패키지의 같은 이름의 클래스가 있는 경우, 다른 이름을 쓰기 위해 사용 가능하다. @Table @Table은 엔티티와 매핑할 테이블을..

준영속 상태

영속 상태 → 준영속 상태 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태이다. (detached) 준영속 상태에서는 영속성컨텍스트가 제공하는 기능을 사용할 수 없다. 준영속 상태로 만드는 법 entityManager.detach(entity) 특정 엔티티만 준영속 상태로 만든다. entityManager.clear() 엔티티 매니저 안의 영속성 컨텍스트를 초기화한다. entityManager.close() 영속성 컨텍스트를 종료한다. 준영속 상태가 되었는지 확인 UPDATE 쿼리 실행여부로 확인 저장되어있는 member의 이름을 변경한 후 준영속 상태로 만든 뒤 커밋하니, SELECT 쿼리는 실행되지만 UPDATE 쿼리는 실행되지 않는 것을 볼 수 있다. SELECT 쿼리 여러번 실행되는 것으로 ..

플러시

플러시(flush) 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것 커밋 될 때 실행됨 영속성 컨텍스트의 변경 사항과 DB를 일치시키기 위해 쿼리를 날리는 과정 변경 감지 수정된 엔티티를 쓰기지연 SQL 저장소에 등록 쓰기지연 SQL 저장소의 쿼리를 DB에 전송 (등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시 하는 방법 emtityManager.flush() → 직접 호출하는 방법, 거의 사용하지 않는다. 트랜잭션 커밋 → 플러시 자동호출 JPQL 쿼리 실행 → 플러시 자동호출 오류 방지를 위해 무조건 flush 실행 flush를 실행하면 1차 캐시가 지워지는가? 1차캐시는 유지된다. 영속성 컨텍스트 쓰기지연 SQL 저장소에 있는 쿼리들을 DB에 반영하는 과정이다. 플러시 모드 옵션 entityM..

영속성 컨텍스트 2

엔티티 조회, 1차캐시 JPA에서 1차 캐시는 엔티티를 영속성 컨텍스트에서 관리하는 캐시를 의미한다. find()나 getReference() 메서드로 조회한 엔티티 객체는 1차 캐시에 저장된다. 같은 엔티티를 다시 조회할 경우 1차 캐시에서 먼저 조회하게 되어 DB에서 조회하지 않고 캐시된 엔티티를 반환한다. 1차 캐시는 엔티티 매니저의 생명주기와 같이 유지된다. 1차 캐시에 저장된 엔티티의 상태가 변경되면 엔티티 매니저는 변경 내용을 즉시 DB에 반영하지 않아도 된다. 엔티티 저장 엔티티를 생성한 후 persist 메서드를 이용해 영속 상태로 만든다. DB PK로 지정한 값을 키로, 엔티티 자체를 값으로 1차 캐시에 저장한다. 엔티티 조회 - 1차 캐시에서 조회 find 메서드를 사용하면 우선 DB가..