본문 바로가기

전체 글102

엔티티 저장 시 연관 엔티티의 아이디로만 연관관계 설정하는 법 궁금한 점 연관 관계가 있는 엔티티의 ID를 알고있고 굳이 그 연관 엔티티의 다른 필드를 사용할 필요가 없는 경우에도 Repository에서 해당 엔티티를 찾아서 넣어줘야 하는걸까? @RequiredArgsConstructor public class Example { private final TeamRepository teamRepository; private final MemberRepository memberRepository; public void saveMember() { // 팀 아이디를 이미 알고있고 굳이 팀 내부의 다른 필드를 사용할 이유가 없는 경우 Long teamId = 1; Member member = new Member(); member.setTeam(???); // 멤버에 팀을 외.. 2022. 7. 15.
1041번 주사위 문제 https://www.acmicpc.net/problem/1041 풀이 큐브로 생각해서 풀면 쉽습니다. 문제의 주사위를 블록으로 호칭하겠습니다. N 크기의 정육면체는 N=1 인 경우를 제외하고는 다음과 같이 구성됩니다. 모서리 블록 + 모서리를 제외한 테두리 블록(N=2 제외)+ 테두리 안쪽 블록(N=2 제외) 각 부분의 블록이 보여주는 면은 다음과 같습니다. 모서리 = 3면 테두리 = 2면 안쪽 = 1면 문제는 바닥면을 제외한 5 면의 최소합을 구하는 것입니다. 그러면 모서리, 테두리, 안쪽블록이 가질수 있는 면의 최소합을 구한 다음 각 구성의 개수만큼 곱해서 더해주면 됩니다. int minOne; // 안쪽인 1면 최소합 int minTwo; // 테두리인 2면 최소합 int minThree; .. 2022. 6. 21.
단위 테스트 (Unit Test) 단위테스트와 통합테스트 단위 테스트 (Unit Test) 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트 모듈은 클래스가 될 수도, 메소드가 될 수도 있습니다. 다른 모듈과의 의존을 최대한 배제하여 온전히 순수한 모듈 그 자체로만 테스트하도록 해야합니다. 모든 모듈에 대한 각각의 Test Case를 작성하여 모듈이 의도된대로 동작하는지 테스트를 진행합니다. 통합 테스트 (Integration Test) 모듈을 통합하는 과정에서 모듈 간의 호환성을 확인하기 위해 수행되는 테스트 통합된 모듈들이 정상적으로 작동하는지를 테스트합니다. 단위테스트의 필요성 테스팅에 대한 시간과 비용을 절감할 수 있습니다. 통합 테스트의 경우, 여러 모듈 간의 상호작용을 테스트하기 때문에 모든 모듈을 로드하고 .. 2022. 6. 21.
Mockito Mockito란? 자바에서 단위테스트를 하기 위한 Mock Object를 creation(생성), verification(검증), stubbing 해주는 프레임워크 Spring Boot에는 자동으로 포함되어 있습니다. Mock Object 테스트를 수행할 객체가 의존하는 다른 객체들을 흉내내는 가짜 객체 가짜 객체를 만들어 사용함으로서 외부에 의존하지 않는 순수한 단위테스트가 가능해집니다. Mock Object Creation 🔥 Inline 방식과 Annotation 방식이 있습니다. mock() 파라미터로 들어온 객체의 Mock을 생성합니다. 생성된 Mock Object는 스터빙을 해서 사용해야합니다. MemberService memberService = Mockito.mock(MemberServic.. 2022. 6. 21.
REST API란 API 란? Application Programming Interface 운영 체제나 프로그래밍 언어, 응용프로그램이 제공하는 기능을 그 기능을 사용하고자 하는 응용 프로그램에서 사용하고 제어할 수 있도록 만든 인터페이스 API를 사용하면 내부 구현 로직을 알지 못해도 정의되어 있는 기능을 쉽게 사용할 수 있습니다. REST 란? Representational State Transfer 자원의 이름으로 구분하여 해당 자원의 상태를 교환하는 것을 의미 REST는 서버와 클라이언트의 통신 방식 중 하나 입니다. 프로토콜이 아닌 네트워크 소프트웨어 아키텍처입니다. HTTP URI를 통해 자원을 명시하고 HTTP Method를 통해 자원을 교환합니다. REST가 가져야하는 조건 Client - Server 구조.. 2022. 6. 16.
@GeneratedValue 로 UUID 사용하기 참고용이기 때문에 간단하게 사용법하고 주의사항만 정리하겠습니다. 사용법 Entity @GeneratedValue 어노테이션을 설정 @Column을 BINARY(16)으로 타입을 UUID로 @Id @GeneratedValue @Column(columnDefinition = "BINARY(16)") private UUID id; 결과 UUID에서 대시(-)를 제외한 나머지 32자리 문자열이 자동생성되어 저장됩니다. 주의사항 @Column을 직접 BINARY(16)으로 정의한 이유는 디비마다 다르겠지만 JPA로 스키마 자동생성하면 컬럼타입이 BINARY(255)로 정의됩니다. 이러한 경우 UUID는 255를 제외한 16만큼의 자리를 차지하는데 자리를 채우고 남은 공간을 특정 값으로 채워버리는 DB가 존재할 수.. 2022. 6. 13.
JpaAuditing이 Test할 때 적용이 안되는 경우 오류 Spring Data Jpa가 생성해주는 메소드들이 내가 원하는 데이터를 정확히 가져오는지 테스트해보고자 코드를 작성해보았는데 오류가 발생했습니다. 작성 코드 @DataJpaTest class AccountRepositoryTest { @Autowired private AccountRepository accountRepository; @Autowired private AccountUserRepository accountUserRepository; private static AccountUseraccountUser; private static Accountaccount; @BeforeAll static void init() { accountUser= AccountUser.builder() .name(.. 2022. 6. 12.
Junit, Mockito 를 이용한 테스트 테스트시 이점 테스트를 짜면서 코드를 자연스럽게 리뷰하게 됩니다. 테스트 하기 어려운 경우, 코드가 잘못된 것을 빨리 알아챌 수 있습니다. 너무 다양한 일을 하고 역할이 많은 경우 테스트 하기 어렵습니다. 테스트가 잘 되어 있으면 리팩토링이 수월합니다. 코드의 품질이 좋아집니다. 현재 코드의 세부적인 정책들이 모두 테스트로 문서화 됩니다. 장기적으로 볼 때 더 빠르고 안정적인 개발이 가능해집니다. 테스트 작성 유의사항 클래스나 메소드가 SRP를 잘 지키고 너무 크지 않도록 합니다. 유닛 테스트의 경우 적절한 Mocking으로 격리성을 확보합니다. 테스트 커버리지를 높여서 테스트가 안되는 부분이 없도록 합니다. 테스트 코드도 코드라는 생각으로 개선합니다. 테스트 도구 JUnit xUnit이라는 유닛테스트 .. 2022. 6. 11.
Embedded Redis Redis Remote Dictionary Server Key - Value 기반의 오픈 소스 In - Memory NoSQL 데이터베이스 Key - Value 기반으로 쿼리를 따로 작성할 필요 없이 결과를 바로 가져올 수 있습니다. 메모리에서 데이터를 처리하기 때문에 속도가 빠릅니다. 주로 동시성 제어(Lock)나 세션, 캐시 등으로 사용됩니다. Redis Collection (데이터 구조) String 가장 일반적인 형태로, key - value 로 저장하는 형태 List Array 형식의 데이터 구조로 List를 사용하면 처음과 끝에 데이터를 넣고 빼는것은 속도가 빠르지만 중간에 데이터를 삽입할 때는 어려움이 있습니다. Set 순서가 없는 Strings 데이터 집합으로 Sets 에서는 중복된 데이터.. 2022. 6. 10.
Transaction (트랜잭션) ACID Atomic (원자성) All or Nothing 하나의 트랜잭션 내에서 이루어지는 모든 작업은 모두 완료되어 Commit되거나 모두 실행되지 않고 Rollback되어야합니다. Consistency (일관성) 모든 트랜잭션이 종료된 후에는 DB의 제약조건을 모두 지키고 있는 상태가 되어야 합니다. Isolation (격리성) 트랜잭션은 다른 트랜잭션과 독립적으로 동작해야합니다. 하나의 트랜잭션에 다른 트랜잭션이 끼어들면 안됩니다. 현실적으로는 끼어들기도 하는 성능과 안정성의 trade-off 가 있는 특성입니다. Isolataion Level (트랜잭션의 격리 수준) 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있는 정도에 관한 Lev.. 2022. 6. 10.
엔티티 매핑 엔티티와 테이블을 매핑하는 어노테이션에 대해서 알아보려고 합니다. JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류할 수 있습니다 객체와 테이블 매핑 @Entity @Table 기본 키 매핑 @Id 필드와 컬럼 매핑 @Column 연관관계 매핑 @ManyToOne, @JoinColumn 연관관계 매핑은 양이 많아 다른 게시물로 정리하도록 하겠습니다. 객체와 테이블 매핑 @Entity JPA를 사용해서 테이블과 매핑할 클래스에 @Entity 를 붙입니다. JPA가 관리하는 객체를 Entity라 합니다. name 속성 JPA에서 사용할 엔티티 이름을 지정합니다. 보통 기본값인 클래스 이름을 사용합니다. 다른 패키지에 이름이 같은 엔티티클래스가 존재한다면 이름을 지정해서 충돌을 피해야 합니다. .. 2022. 6. 10.
영속성 관리 JPA가 제공하는 기능은 크게 엔티티와 테이블을 매핑하는 설계 부분과 매핑한 엔티티를 실제 사용하는 부분으로 나눌 수 있습니다. 여기서는 매핑한 엔티티를 EntityManager를 통해 사용하는 법을 정리하려합니다. 여기서는 Hibernater를 기준으로 정리합니다. 구조 요청이 올 때마다 EntityManagerFactory를 통해 EntityManager를 생성합니다. EntityManager는 내부적으로 DB 커넥션을 통해 DB를 사용합니다. Entity Manager Factory EntityManager를 생성합니다. 생성 비용이 크기 때문에 하나만 생성해 애플리케이션 전체에서 공유하여 사용합니다. 설정 정보를 읽어 JPA를 동작시키기 위한 기반 객체 생성 및 커넥션 풀 생성 등으로 생성 비용이.. 2022. 6. 10.
데이터베이스 방언 (Dialect) 데이터베이스 방언이란? JPA는 특정 데이터베이스에 종속적이지 않아 손쉽게 다른 데이터베이스로 교체할 수 있습니다. 다만, 데이터베이스 벤더마다 SQL 문법과 함수가 조금씩 다른데 이를 Dialect(방언)이라고 합니다. JPA 구현체들은 다양한 데이터베이스 Dialect 클래스를 제공합니다. 개발자는 JPA가 제공하는 표준 문법에 맞춰 JPA를 사용하면 되고, 특정 데이터베이스에 의존적인 SQL은 데이터베이스 Dialect가 처리해줍니다. 스프링부트에서 application.properties에서 hibernate.dialcet=db별 방언 클래스 로 사용합니다. 하이버네이트의 방언 지원 정보는 아래의 주소에서 확인 가능합니다. https://docs.jboss.org/hibernate/orm/4.3/.. 2022. 6. 10.
JPA 소개 📗 JPA 😡 SQL을 직접 다룰 때 발생하는 문제점 반복되는 작업들 반복되는 CRUD 코드 작성 JAVA 애플리케이션은 JDBC API를 사용해 DB와 통신하며 데이터를 CRUD 합니다. 개발자는 애플리케이션과 DB 사이에서 SQL 및 JDBC API 코드를 작성해야 합니다. 연결해야하는 테이블 및 데이터가 늘어날수록 반복적인 CRUD 코드들을 계속해서 반복해서 작성해주어야합니다. SQL에 의존적인 개발 엔티티에 변경점이 발생하면 관련된 모든 SQL을 수정해야합니다. DAO를 열어서 어떤 SQL이 실행되는지 직접 확인하고 수정해야합니다. 이와 관련된 자바 CRUD 코드들도 수정을 해주어야합니다. 이러한 변경이 잦아지면 변경할 코드도 많아지고 관리하기가 어렵습니다. 패러다임의 불일치 자바와 관계형 데이터.. 2022. 6. 10.
Test용 H2 DB application.yml 설정 H2 DB 란? 자바 기반의 오픈 소스 RDBMS입니다. Server 모드와 Embeded 모드를 지원합니다 Embeded 모드의 경우, In memory로 동작합니다. (휘발성) 브라우저 기반의 콘솔 프로그램입니다. 별도의 설치과정이 필요없고, 2MB 용량으로 매우 가볍고 빠릅니다. ANSI 표준 SQL을 사용합니다. JDBC API를 지원합니다. 주로 개발단계에서 테스트용 인메모리 DB로 사용됩니다. application.yml spring: datasource: url: jdbc:h2:mem:test username: sa password: driver-class-name: org.h2.Driver h2: console: enabled: true jpa: defer-datasource-initial.. 2022. 6. 9.