개요 블랙잭 미션 중 Card 도메인에 대해 캐싱을 적용해본 적이 있었다. Card 도메인의 특징 중 하나는 열거형처럼 지정된 종류의 카드가 정해져있어 게임에서 존재하는 Card의 개수는 Suit와 Rank의 카테시안 곱과 같다. 따라서 미리 모든 Card를 만들어
객체를 생성할 때, 즉 인스턴스를 생성할 때 메모리를 소모한다.하지만 굳이 매번 인스턴스를 만들 필요 없이 보통 인스턴스 하나만 필요한 경우가 있다.예를들면 데이터베이스 접근 객체(DAO), 콘솔 입출력을 위한 객체(View)등이런 객체들은 굳이 인스턴스를 만들 필요가
개요 우테코 미션을 수행하거나 간단한 프로그램을 구현하여 볼 때 사용자 입력에 따라 어떠한 결과를 기대하는 로직을 작성해 본 적이 있을 것이다. 사용자 입력에 대해 조건문을 사용하여 원하는 결과에 맞게 출력하는 로직을 작성하게 된다면 모든 조건에 사용자가 입력한 커
동일성과 동등성이 뭘까?우선 개념적으로 알아보자.두 개체가 있을 때 동일성(同一性, identity)은 두 개체가 완전하게 동일하다는 것을 의미한다.즉, 두 개체는 정확히 같은 것이며, 어떤 면에도 차이가 없다.예를 들어, “A는 A이다”는 동일성의 예이다.동등성(同等
불변 객체가 뭘까?불변 객체는 생성된 후 변경할 수 없는 객체를 말한다.불변 객체는 생성되면 그 상태를 수정할 수 없고, 수정하는 모든 시도는 업데이트된 상태를 가진 새로운 객체가 생성된다.불변 객체를 만드려면 다음과 같은 규칙을 따르면 된다.1\. 모든 필드를 pr
우테코 체스 미션에서 데이터베이스를 사용할 때, Spring을 사용하여 무엇을 만들어 볼 때 Gradle이란 도구를 사용해봤다. Gradle? Gradle
자바는 객체 지향 프로그래밍 언어이다.그리고 객체 지향 프로그래밍 언어는 객체 지향적으로 설계를 해야한다.그렇다면 객체 지향적으로 설계를 하는것이 무엇일까?객체 지향적으로 설계를 하려면 어떻게 설계를 해야할까?우선 예시 코드로 보자위의 코드의 경우 A가 B에 강하게 의
"의존성을 주입한다"여기서 의존성이란 무엇이고 의존성을 주입한다는 것은 무엇인가?그리고 의존성을 주입하는 여러 방법과 장단점에 대해 알아보자.우선 의존성이란 무엇일까?바로 코드로 알아보자A와 B라는 클래스가 있고, A의 로직이 B의 로직을 사용한다.B의 로직이 변경되면
스프링 빈의 스코프에 대해 알아보자.우선 스프링 빈이란 뭘까?Spring Bean은 스프링의 핵심 개념이다.스프링 공식문서(https://docs.spring.io/spring-framework/docs/current/reference/html/core.htm
스프링을 사용하여 얻는 이점 중 하나는 의존성을 자동으로 해결해 준다는 점이다.그렇다면 스프링을 사용해서 의존성을 갖는 모든 객체를 스프링 빈으로 등록하면 더 편하게 사용할 수 있지 않을까?보편적으로 스프링으로 웹 서버를 만들 때 스프링 빈으로 등록하는 객체들이 있다.
자동차 경주 미션을 콘솔에서 웹으로 구현하는 과정에서, 콘솔 어플리케이션은 스프링을 사용하지 않고, 직접 의존성 주입을 통해 실행했었다.콘솔 어플리케이션은 스프링을 사용하지 않기 때문에 스프링이 제공해 주는 JdbcTemplate를 사용을 못 하니 데이터베이스를 사용하
다음과 같은 URL이 있다.GET /products/{productId}해당 URL은 Product라는 자원에서 특정 Product를 조회한다.해당 URL을 스프링을 사용하여 컨트롤러의 핸들러 메소드에 매핑한다면 다음과 같다.스프링에서 제공하는 @PathVariable
장바구니 미션 2단계에서 인증에 관한 기능을 추가하는 요구사항이 있었다.인증에 대한 요구사항은 Basic 인증 방식이고, 해당 인증을 구현하려면 클라이언트의 요청의 Authorization 헤더에 있는 BASE64로 인코딩된 계정 정보를 기반으로 인증을 수행한다.따라
스프링 프레임워크의 핵심 기능은 IoC 컨테이너를 이용하여 객체에 대한 의존성 주입을 해주는 것이다.스프링이 의존성을 해결한 객체는 Bean이라고 부르는데, Bean은 스프링 IoC 컨테이너에 의해 생성되고 관리된다.빈은 Lifecycle(생명주기)을 가지는데, 이 생
Spring을 사용해서 무엇을 만든다고 하면 대부분은 웹 어플리케이션을 제작한다.이때, @Controller 어노테이션을 붙여 HTML 형식의 데이터를 제공하지 않고, 주로 @RestController 어노테이션을 붙여, JSON 형식의 데이터를 제공하는 API 서버를
장바구니 미션의 주요 기능은 주문을 하는 것이다.주문할 때, 여러 상품을 주문할 수 있고, 수량도 지정할 수 있다.따라서 주문이라는 Order, 주문 상품이라는 OrderItem 객체로 나뉠 수 있다.그리고 사용자는 주문에 대한 기록을 확인해야 하므로 데이터베이스에 주
JPA와 같은 ORM 기술을 사용하면 데이터베이스에 의존적인 개발을 해소할 수 있다.하지만 ORM 기술을 사용한다고 객체와 관계형 데이터베이스 간의 패러다임 불일치 문제를 해결할 수 있을까?지하철 노선도 미션을 JPA로 다시 구현해보는 중 다음과 같은 문제가 발생했다.
부모 엔티티를 저장할 때 연관된 자식 엔티티도 함께 저장하고 싶다면 다음과 같은 과정을 거쳐야 한다.Parent는 List<Child> 필드를 가지고 있다.연관관계 매핑은 Child를 연관관계의 주인으로 설정하여 다대일 양방향 연관관계를 매핑했다.위와 같이 Par
Java 8에서 소개된 Optional 클래스를 사용하면 null 값을 안전하고 효과적으로 다룰 수 있다.Optional은 여러 메소드를 제공하는데, Optional의 값이 없을 때, 파라미터로 넘어온 값을 반환해주는 orElse() 메소드가 대표적이다.그리고 orEl
안녕하세요.페스타고는 인증을 구현할 때, 최소한의 정보로 안전하게 인증을 구현할 수 있는 OAuth2를 채택하였습니다.OAuth2를 구현할 때 서비스를 제공하는 회사들은 매우 많습니다.그중에서 저희가 선택한 OAuth2 제공자는 카카오톡 입니다.카카오톡을 선택한 이유는
안녕하세요.페스타고에는 다양한 역할의 사용자가 존재합니다.이렇게 다양한 역할의 사용자가 있다면 사용자의 역할에 맞는 인증과 인가 작업이 필요합니다.단순히 역할에 따른 구분이라면 큰 문제가 없겠지만, 다양한 사용자들이 접속하는 환경에서 인증을 하는 방법에서 차이로 인해
하나의 논리적인 작업 단위트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질트랜잭션 내에서 모든 연산은 전부 실행되거나, 실행되지 않아야 한다.All or Nothing트랜잭션을 통해 데이터가 변해도, 데이터베이스의 일관성을 유지해야 한다.제약조건을 위반하면 안된다
스프링 프레임워크를 사용하면 데이터베이스의 트랜잭션을 매우 쉽게 사용할 수 있다.단순히 @Transactional 어노테이션만 붙이면 마법같이 해당 메소드가 시작되고 끝날때 까지 트랜잭션이 적용된다.이처럼 트랜잭션의 적용이 매우 쉽고 간단하기 때문에 정말 트랜잭션이 필
객체 지향 프로그램에서 시스템의 구조를 나타내는 다이어그램.UML의 일부로 코드로 풀어진 객체간의 관계를 그림으로서 이해하기 쉽게 표현해주는 수단이다.따라서 개발자 사이에서 원할한 의사소통을 위해 필수적으로 알아야 한다고 생각한다.클래스 다이어그램의 주요 요소는 두 가
우아한테크코스에서 진행한 프로젝트인 "페스타고"에서 동시성 이슈를 어떻게 해결했는지에 대한 기록을 작성한다.
Java의 제네릭을 사용하고, 개념에 대해서 배우면 공변과 불공변에 관한 얘기가 나온다.단어가 난해하고, 실생활에 접하기 힘든 단어라 어렵다고 생각할 수 있지만 사실 간단한 용어이다.그렇다면 자바에서 공변과 불공변이 무엇인지 알아보자.공변(Covariant)이란 Sub
계정의 정보에는 아이디와 비밀번호가 기본적으로 구성되어 있다.사용자가 계정에 로그인할 때 아이디와 비밀번호를 서버로 전송하게 되는데, 이때 HTTPS를 사용한다면 기본적으로 암호화가 되므로, 중간에 유출이 되더라도 보안을 지킬 수 있다.하지만 서버에 계정의 정보가 제공
최근 Gradle에서는 코틀린 문법을 사용한 버전을 기본 언어로 채택하였다.따라서 코틀린 + 스프링 프로젝트를 사용하면서, Gradle 설정도 Groovy를 사용하는 것이 아닌, 코틀린 문법으로 된 Gradle 설정을 사용하였다.미래의 변화에 유연하게 대응하기 위함도
어플리케이션을 만들고 제대로 동작하는 것을 확인하려면 단순히 DB에 값이 변한 것을 보는 것이 아니라, 특정 시간에 어떤 작업이 어떻게 수행되었는지 확인할 수 있어야한다.즉, 로그를 남겨 확인할 수 있어야 한다.또한, 로그를 남기는 작업은 System.out.print
어떤 언어로 개발하든, 테스트 코드는 작성할 수 있다.테스트 코드가 필요한 이유는 작성한 코드가 제대로 작동하는지 검증하는 이유도 있지만, 코드로 표현되는 문서화와 요구 사항의 증명이라고 생각한다.그만큼 테스트 코드는 중요하고 가독성 있게 잘 작성할 수 있어야 한다.테
테스트 코드는 어플리케이션의 동작을 보장해 준다.또한, 잘 작성한 테스트 코드는 그 자체로 문서화가 된다.TDD 방법론으로 개발을 진행하면, 실제 동작하는 클래스를 구현할 수 없으니, Mock 또는 Fake 객체 같은 모의 객체를 사용한다.굳이 TDD가 아니더라도, 통
Kotlin을 사용했을 때 Java와 비교했을 때 무엇이 좋은가 물어본다면, 나는 확장함수의 사용이라고 말하고 싶다.확장함수를 사용하면, 기존에 작성되어 있던 코드를 수정하지 않고 새로운 기능을 추가할 수 있다.또한 DSL(Domain-Specific Language)
좋은 단위 테스트는 FIRST 원칙을 지켜야 한다.FIRST에서 앞의 두 원칙인 Fast는 빨라야 하고, Isolated는 격리되어야 한다는 뜻이다.즉, 단위 테스트는 빠르게 실행되고, 다른 테스트에 대해 영향을 받으면 안 된다.하지만, 스프링을 사용하는 코드에서는 순
Spring과 관계형 데이터베이스를 사용하여 개발한다면 JPA 또한 사용할 것이다.그리고 JPA를 사용한다면 Spring Data JPA 또한 사용할 것이다.JPA를 사용하면 생성, 수정, 삭제와 같은 Command 로직을 SQL로 구현하지 않고, Java(또는 Kot
진행하고 있는 프로젝트인 페스타고에서는 사용자 인증 기능을 OAuth2를 기반으로 한 인증을 구현하고 사용했다.OAuth2의 장점이라면 서비스 내에 사용자의 비밀번호와 같은 민감한 정보를 보관하지 않아도 되므로 보안이 향상된다는 것이다.또한 OAuth2에는 여러 권한
Spring으로 프로젝트를 만들면 대부분은 자바를 사용한다.하지만 Spring은 자바뿐 아니라, Groovy, Scala, 코틀린 등 JVM 위에서 돌아가는 언어라면 굳이 자바가 아니어도 사용할 수 있다.이때 주로 Kotiln을 주로 자바 대신 사용하는데, 코틀린의 특
객체지향 언어의 특징 중 하나는 상속을 통한 다형성의 지원이다.다형성을 이용하면 객체가 가진 구체적인 정보를 알지 않고 추상적인 행동으로 의존성과 결합도를 낮추며 비즈니스 로직을 처리할 수 있다.하지만 다형성을 모두 적용하기엔 이상에 가깝고, 실제 비즈니스 로직에서는