본문 바로가기

전체 글

(20)
[Golang] Mock, Mockery를 이용하여 단위 테스트 하기 전체 소스 코드는 Github 있습니다 :) 단위 테스트를 진행할 때 의존성이 있는 컴포넌트는 해당 의존성 객체를 Mock으로 사용할 수 있습니다. 이때 Golang에서 Mock을 생성하는 방법이 (1) 직접 생성 / (2) stretchr/testify 이용 / (3) golang/mock 이용 하는 방법 정도가 있습니다. 이번 글에서는 (2)번에 있는 testify의 mock 패키지와 mockery(mock 코드 자동 생성)를 이용하여 테스트 하는 방법에 대해 소개하겠습니다. 테스트용 코드 간단한 기능 테스트를 위해 아래와 같이 사용자 모델(User)를 정의하고 저장하는 기능을 구현합니다. import ( "context" "errors" ) // ErrKeyConflict insert or upda..
[Golang] Go, Echo, GORM으로 RealWorld Backend 구현하기(1) - 소개 전체 소스 코드는 Github에 있습니다 :) 1년 전부터 고언어로 전환하면서 나름대로 어떻게 하면 더 좋은? 고언어스러운? 코드로 구현할 수 있을지 많이 고민하고 있습니다.(지금도..) 다른 많은 프로젝트를 꾸준히 참조하고 있지만, 아무래도 직접 만들 때 가장 와닿아서 Golang 기반으로 예제 애플리케이션을 만들고자 했습니다. 그러던중 이전에 봤던 RealWorld라는 프로젝트가 생각났고, 해당 스펙을 고언어로 구현 후 포스팅을 하게 되었습니다(해당 프로젝트로 PR은 하지 않았습니다) RealWorld 프로젝트는 정의된 스펙이 있고 해당 스펙에 맞춰서 Frontend/Backend/Fullstack 별로 아래와 같이 구현 리스트가 있습니다. ) (https://codebase.show/projects..
[MySQL] 실행계획-1 해당 내용은 Real MySQL의 내용을 정리 ERD 아래와 같은 테이블을 가지고 실행 계획들을 분석 아래와 같이 실행 계획(EXPLAIN)을 확인해보면 id, select_type, table, partitions, type, key, key_len, ref, rows, Extra 등이 포함된 것을 확인할 수 있다. EXPLAIN SELECT e.emp_no, e.first_name, s.from_date, s.salary FROM employees e, salaries s WHERE e.emp_no = s.emp_no LIMIT 10; (1) id 컬럼 실행 계획에서 가장 왼쪽에 표시되는 id 컬럼은 단위 SELECT 쿼리별로 부여되는 식별자 값 하나의 SELECT 문장 안에서 여러 개의 테이블을 조..
[JPA] Persistence Context(영속성 컨텍스트) 해당 내용은 자바 ORM 표준 JPA 프로그래밍의 내용을 정리 Persistence Context 영속성 컨텍스트(Persistence Context)는 엔티티를 영구 저장하는 환경이라는 뜻 엔티티 생명주기 Entity에는 아래와 같은 4가지의 상태가 존재한다. 1. 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 상태 2. 영속(managed): 영속성 컨텍스트에 저장된 상태 3. 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태 4. 삭제(removed): 삭제된 상태 비영속 Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 영속 em.persist(member)..
[JVM-02] JAVA Garbage Collection (GC) GC 개요 Garbage Collection은 시스템에 있는 객체들의 수명을 정확히 몰라도 런타임이 대신 객체를 추적하며 쓸모없는 객체를 제거하는 것이다. GC는 Pluggable Subsystem으로 고려되며 JVM Spec 에도 객체용 힙 공간은 자동 저장소 관리 시스템으로 회수한다. 어떤 일이 있어도 객체를 명시적으로 해제해서는 안된다 라고만 적혀있다. 즉 같은 자바 프로그램 이라도 코드 변경 없이 다양한 GC에서 돌려 볼 수 있다. 모든 GC 구현체는 아래와 같은 두가지 기본 원칙을 준수해야한다. 알고리즘은 반드시 모든 가비지를 수집해야 한다. 살아 있는 객체는 절대로 수집해선 안된다. 또한 Weak Generational Hypothesis는 JVM 메모리 관리의 이론적 근간을 형성하였다. 대부..
[JVM-01] JVM Architecture 해당 내용은 Naver D2 Hello에 포스팅 된 JVM Internal과 자바 최적화를 기반으로 내용을 정리하였습니다. Table of Contents JVM Architecture 1. Class Loader 1.1 Loading 1.2 Linking 1.3 Initialization 2. Runtime Data Area 3. Execution Engine JVM Architecture (출처: https://dzone.com/articles/jvm-architecture-explained) JVM 특징 스택 기반의 가상 머신: JVM은 스택 기반으로 동작한다. 심볼릭 레퍼런스: Primitive data type을 제외한 모든 타입(클래스, 인터페이스)을 명시적인 메모리 주소 기반의 레퍼런스가 아..
Spring Cloud Service Discovery - Netflix Eureka (2) 전체 내용은 Github에 있습니다 :) Netflix Eureka Server HA 이전 포스팅에서 Eureka에 대한 개요를 살펴보았다. 이번엔 Eureka Server에서 HA 구성을 어떻게 하는지 살펴보자. Peer Awareness Eureka Cluster에서 Eureka Server는 peer 라고 표현하고 아래와 같은 행위를 Peer Awareness라고 부른다. 각각의 Eureka Server는 Eureka Client를 이용하여 Register와 Fetch Registry 작업이 이루어진다. 또한 Register, Renew 등 모든 Operation이 발생하면 다른 Peer에게 동일한 요청을 시도한다. 아래와 같이 PeerAwareInstanceRegistryImpl를 살펴보자. Re..
[gorm] gorm.Model 사용 및 삭제 시 주의할 점 gorm.Model 구조체에 대하여 기본적인 사용 방법과 Unique 속성을 가진 테이블에 대하여 gorm의 Delete(Soft delete) 함수 실행 시 어떤 문제가 발생할 수 있고 해결할 수 있는지에 대해서 살펴보겠습니다 :) gorm.Model 사용하기 gorm에서는 CreatedAt, UpdatedAt 등의 Auditing을 하기 위해 아래와 같은 gorm.Model을 제공합니다. type Model struct { ID uint `gorm:"primarykey"` CreatedAt time.Time UpdatedAt time.Time DeletedAt DeletedAt `gorm:"index"` } 위의 gorm.Model을 Embedded 구조체로 아래와 같이 이용할 수 있습니다. type..
[Gin] 바인딩 및 에러 처리하기 gin 은 golang의 인기있는(스타가 많은?) web framework 중 하나이며 http request의 header, uri, query, json body 등을 바인딩 하는 방법을 살펴보고 주의해야 할 점에 대해 알아보겠습니다. 목차 바인딩 할 태그 정의 Validation 추가 ShouldBindXXX 이용하기 전체 소스 코드 테스트 진행하기 에러 핸들링하기 마무리 1. 바인딩 할 태그 정의 우선 아래와 같이 태그를 이용하여 바인딩 할 필드를 정의할 수 있습니다. header : header:"header-key" uri : uri:"uri-path" query : form:"query-parameter-name" type HeaderParameter struct { XRequestID st..
Spring Boot Test 하기 (1) (모든 전체 코드는 github에 있습니다. ) Spring boot에서는 다양한 어노테이션 등을 이용해서 테스트를 쉽게 할 수 있도록 도와줍니다. 첫번째 포스팅에서는 Spring 기반의 Application 어떻게 이루어져있고 간단한 Rest API 를 만들어 보겠습니다. Overview Spring기반의 RESTFul Web Service는 아래와 같이 표현될 수 있습니다.(HandlerMapping 등은 생략) Spring layer (출처: https://terasolunaorg.github.io/guideline/5.0.1.RELEASE/en/ArchitectureInDetail/REST.html) (1) : User -> WebService로 HTTP POST 요청(Create) (2) : J..
Spring Cloud Service Discovery - Netflix Eureka (1) 전체 내용은 Github에 있습니다 :) 목차 DiscoveryClient Netflix eureka 개요 Netflix eureka 시작하기 DiscoveryClient 서비스 레지스트리는 서비스 인스턴스와 서비스가 제공하는 API를 포함하는 테이블입니다. (서비스 레지스트리는 CAP(Consistency 일관성, Availability 가용성, Partition tolerance 분리 내구성) 정리의 제약을 받는다고 합니다. CAP 이론을 정확히 알지못하지만 3가지를 만족하는 분산 시스템은 존재하지 않는다? 그래서 상황에 따라 2개를 만족하는 시스템을 선택한다? 이런 내용인 것 같습니다) Spring Cloud는 DiscoveryClient 추상화를 통해 다양한 유형의 서비스 레지스트리를 이용할 수 ..
Spring Security + OAuth2(JDBC) + Swagger 서버 구축하기 전체 내용는 github 에서 확인할 수 있습니다 (스타는 사랑입니다) Spring security + OAuth2(JDBC) + Swagger를 모두 설명하기 보다는 구현에 초점을 두겠습니다. 또한 UserDetailService등의 구현 설명은 생략 하겠습니다. Index 의존성 추가 스프링 관련 설정 JDBC 기반 OAuth2 프로젝트 실행 테스트(SWAGGER-UI) 테스트(JUNIT) 의존성 추가 Security, OAuth2, Swagger 관련 의존성 추가 org.springframework.boot:spring-boot-starter-security org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2...