본문 바로가기

분류 전체보기311

Kotlin 서버 개발하기 1 Kotlin으로 서버 개발하기 1 개발하다보면 조금 더 간결한 표현 방법은 없는지 많이 고민하게 됩니다. 나도 동료도 코드를 더 쉽게 읽을 수 있다면 덜 피곤해지기 때문이죠. 이번 글에는 코틀린 서버 개발 세팅을 진행합니다. 프로젝트를 만들면서 진행합니다. 1. 프로젝트 생성 인텔리제이 Ultimate 버전입니다. 무료로 진행하려면 https://start.spring.io/ 에 방문하셔서 zip 파일 형태로 프로젝트를 생성할 수 있습니다. 언어: kotlin, Java 17 빌드 및 의존성 도구: gradle 2. 의존성 추가 리액티브 웹 앱 생성을 위해 아래의 의존성을 추가합니다. 리액티브로 웹 앱 간단한 예제 프로젝트입니다. (Web MVC 로 하셔도 됩니다.) 이 글의 초점은 코틀린을 활용한 웹 .. 2022. 9. 28.
일대다(1:N) 페이징 처리(OneToMany Pagination) 일대다(1:N) 페이징 처리(Spring Data JPA) TL;DR 1:N 연관관계인 두 엔티티가 즉시 로딩된다면 (엔티티 그래프나 fetch join 으로 연결되어 있다면) 페이징 처리시 쿼리에 limit 가 붙지 않고 모든 데이터가 메모리에 불러와진다. 페이징 처리를 위해서는 연관된 컬렉션을 한꺼번에 가져올 배치 사이즈를 정한다. (예시: 100개로 정하기) spring: jpa: properties: hibernate: default_batch_fetch_size: 100 요구사항 어드민 화면에서 모든 사용자의 주문내역을 불러오는 화면이 필요합니다. 우리는 수많은 주문들을 한 화면에 불러오기 보다는 페이징 처리를 통해 한번에 필요한 갯수만큼 가져오겠습니다. Entity 연관관계 주문과 주문상품이 .. 2021. 11. 28.
JPA - 기본키 생성 전략 JPA - 기본키 생성 전략 관계형 데이터베이스에서 테이블은 각각의 행을 구별하는 기본키가 필요하다. 기본키를 만들 때는 주민등록번호, 주문번호 같은 '자연키' 를 사용할 수도 있고, 논리적 의미가 하나도 없는 하나씩 증가하는 순번 같은 '대체키'를 사용할 수도 있다. 기본키로 어떤 것을 선택하면 좋을까? 주문번호 관련 생성 정책이 변경되거나 주민등록번호를 더 이상 저장하면 안된다는 정책이 생기는 등 자연키는 기본키로 정할 수 있는 올바른 전략이 아닐 수도 있다. 상황에 따라 다르겠지만 대체키를 권장한다. 대체키를 사용하고자 할 때는 Integer 타입 (약 10자리수, 21억 정도까지 표현) 대신 Long 타입 (약 19자리, 9백경 정도까지 표현)을 사용하여 표현 범위를 .. 2021. 9. 26.
JPA - 연관관계 매핑(N:1, 1:N, 1:1, N:N) JPA 005 - 다양한 연관관계 매핑 다대일, 일대다, 일대일, 다대다 매핑을 알아보자. (앞에 있는 객체가 외래키를 가지는 연관관계 주인이라고 가정한다.) 1. 다대일 (N:1) 저번시간에 JPA - 단방향, 양방향 연관관계 매핑 글에서 Comment (N) - Post (1) 관계에서 연관관계 주인을 Comment로 선택하여 외래키를 Comment가 관리하게 하는 예제를 보았다. 다대일 관계는 이를 말한다. 될 수 있으면 단방향 관계만 설정하고, 반대편 (Post) 에서도 조회하고 싶다면 양방향 관계를 추가하고 양방향 매핑을 주의해서 관리해주면 된다. 2. 일대다 (1:N) 일대다 단방향 매핑 일대다 관계는 자바 컬렉션(Collection, List, Set, Map) 중 하나를 사용해서 참조할 객.. 2021. 9. 21.
JPA - 단방향, 양방향 연관관계 매핑 JPA 004 - 단방향, 양방향 연관관계 매핑 TL;DR 두 테이블이 있고, 한 테이블에 외래키가 있는 상황에서 테이블은 항상 양방향 관계를 가진다. A 객체 안에 B 객체가 필드로 있다면, A에서 B로 가는 단방향 관계를 가진다. 단방향 관계만으로 충분히 연관관계 매핑을 할 수 있다. 아래 예제에서 Post 에 있는 @OneToMany 는 사실 없어도 잘 동작한다. 외래키는 @ManyToOne 이 붙은 Comment 에 자연스럽게 생긴다. 반대방향으로도 조회하고 싶으면 양방향 관계를 설정하자. (반대 방향의 객체 그래프 탐색이 가능해진다.) 대신에, 연관관계 편의 메소드 등을 만들어서 양방향 매핑을 모두 잘해주고, 논리적으로 오류가 없도록 관리를 잘 해주어야 한다. 단방향, 양방향? 테이블 vs 객체.. 2021. 9. 20.
JPA - 상속 객체와 테이블 매핑 JPA 006 - 상속 객체와 테이블 매핑 객체는 상속을 통해 공통된 필드를 부모클래스에 만들고, 나머지 필드를 각 자식클래스에 둘 수 있다. 하지만, 관계형 데이터베이스에는 상속의 개념이 없다. 대신 슈퍼타입-서브타입 모델링 기법을 사용할 수 있다. ORM 은 객체의 상속과 데이터베이스의 슈퍼타입-서브타입 관계를 매핑한다. JPA 에서는 객체와 테이블을 매핑할 때 3가지 전략을 제시한다. 1 Joined 전략 부모테이블과 자식테이블 각각을 모두 생성하고, 원하는 데이터를 조인해서 가져온다. 각 자식테이블은 부모와 같은 PK 를 가지면서, 이 PK는 부모의 PK와 관계를 맺는 FK 가 된다. @Entity @Inheritance(strategy = InheritanceType.JOINED) public .. 2021. 9. 19.
한글 검색기 만들기 한글 검색기 만들어보기 주식에 대한 정보를 제공해주는 앱이 있다고 하자. 사용자는 원하는 종목을 검색하고 싶다. 검색창에 한글자, 한글자 입력할 때마다 javascript 는 해당 글자에 관한 검색 결과를 반환한다. 검색 결과는 중요도 우선순위로 정렬되어 보일 수 있는데, 사람들이 많이 클릭했던 순, 시가총액 순 등의 기준을 세울 수 있을 것이다. 위 그림의 결과를 예시로 들 수 있다. 우리는 이를 로직으로 구현하기 위해 sql 에서 like 구문을 생각해볼 수 있다. SELECT item_name FROM item WHERE item_name like '%'||:keyword||'%' item 테이블에는 종목이름이 들어있다. 위 쿼리는 like 검색이기 때문에 인덱스 적용이 힘들고, 원하는 성능의 결과.. 2021. 8. 16.
Spring Security 로그인 구현 (part 3) - OAuth2.0 Spring Security 로그인 구현 (part 3) - OAuth2.0 지난 시간까지는 Form 로그인에 대해서 ( Spring Security 로그인 구현 (part1) - form login, Spring Security 로그인 구현 (part1) - form login ) 알아보았습니다. 하지만 우리가 자주 사용하는 로그인의 또 다른 방식으로 OAuth 로그인이 있습니다. 구글 같은 소셜서비스를 이용해 대신 로그인을 해서 서비스를 사용해본 적이 있으신가요? 어떤 앱서비스에 가입할 때 이렇게 제 3자의 로그인 서비스를 이용하는 것은 크게 3가지 장점이 있습니다. 사용자는 회원가입을 새로 하지 않고, 신뢰할 수 있는 구글같은 서비스로 로그인하니 편리하다. 사용자는 자신의 민감정보를 서버에 건네주지.. 2021. 5. 9.
OAuth 2.0 설명 OAuth2.0 OAuth란? 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다. (wikipedia) 즉, 서비스별 제각각인 인증방식을 표준화한 인증방식이다. 다르게 표현하면 서드파티를 사용하지 않고, API 에 접근할 수 있도록 하는 개방형 표준 프로토콜이다. OAuth 사용 사례 구글, 페이스북과 같은 서비스 API 에 사용자 대신 접근하고 싶을 때 다른 서비스로 로그인 하기 기능을 구현하고 싶을 때 이제 대략 6단계에 거쳐서 OAuth 의 인증절차를 차근차근 알아보자. 1. OAuth 2.0 용어 정리 사용자 (Resource Owner) : 애플.. 2021. 5. 9.
Spring Security 로그인 구현 (part 2) - form login Spring Security 로그인 구현 (part 2) - form login 본 글은 Spring Security 로그인 구현 (part 1) - form login 과 이어지는 글 입니다. 이전 글에서 회원가입 후 회원정보를 DB 에 담기 로그인 기능 구현 을 했습니다. 하지만, 로그인의 경우 기본 스프링이 제공해주는 user 라는 아이디와 콘솔창에서 제공해주는 패스워드를 사용해 로그인이 가능했었습니다. 이번 글에서는 DB에 저장된 사용자 아이디, 비밀번호를 비교하여 로그인 인증을 처리하는 방법을 서술합니다. 사용자이름 검증하기 로그인 정보를 입력하고 post 요청을 하면, 이 때 전달한 username을 받아올 수 있습니다. 받아온 username은 DB에 저장된 유저이름과 비교합니다. 유저이름을.. 2021. 5. 9.
728x90