목록백엔드 (18)
윤개발
이제 데이터베이스에 있는 데이터를 삭제해보자. 도큐먼트 삭제 삭제는 deleteOne과 deleteMany를 제공한다. 두 메서드 모두 첫 번째 매개변수로 제거할 기준을 지정한다. 예를 들어 "_id" 값이 4인 도큐먼트는 아래와 같이 삭제할 수 있다. >db.movies.deleteOne({"_id":4}) { "acknowledged" : true, "deleteCount" : 1} "_id" 값이 컬렉션에서 고유하기 때문에 하나만 삭제할 수 있었지만 여러 도큐먼트와 일치하는 필터도 지정할 수 있다. 이 때 deleteOne은 필터와 일치하는 첫 번째 도큐먼트를 삭제한다. 어떤 도큐먼트가 삭제되는 지는 삽입된 순서, 인덱스 등 몇가지 요인에 따라 달라진다. 필터와 일치하는 모든 도큐먼트를 삭제하려면 ..
이번에는 몽고DB의 기본적인 데이터 입력을 알아보자. 도큐먼트 삽입 삽입은 몽고DB에 데이터를 추가하는 기본 방법이다. 도큐먼트를 삽입하려면 컬렉션의 insertOne 메서드를 사용한다. > db.movies.insertOne({"title" : "Movie 1"}) 그러면 도큐먼트에 "_id" 키가 추가되고 몽고DB에 저장된다. { "acknowledged" : true, "insertedId" : ObjectId("615da8db82227ce1f4f7d899") } 또한 여러 도큐먼트를 삽입하려면 insertMany를 사용하면 된다. 각 도큐먼트에 대해 데이터베이스에 왕복하지 않고 삽입하므로 훨씬 더 효율적이다. > db.movies.insertMany([{"title":"Movie 2"},{"tit..
몽고DB는 매우 강력하면서도 진입장벽이 낮다. 몽고DB의 기본 개념에 대해 알아보자. 도큐먼트 몽고DB의 핵심은 정렬된 키와 연결된 값의 집합으로 이뤄진 도큐먼트다. 도큐먼트 표현 방식은 프로그래밍 언어마다 다르지만 자바스크립트 객체로 표현하겠다. {"name" : "Hello world!"} 이 간단한 도큐먼트는 name 키 값과 벨류를 가진다. 대부분의 도큐먼트는 이보다 복잡한 다중 키/값 쌍을 가진다. 또한 몽고DB는 데이터형과 대소문자를 구별하고 중복된 키를 넣을 수 없다. 아래 도큐먼트는 올바른 도큐먼트가 아니다. {"name" : "123", "name" : "456"} 컬렉션 컬렉션은 도큐먼트의 모음이다. 몽고DB의 도큐먼트가 관계형 데이터베이스의 행에 대응된다면 컬렉션은 테이블에 대응된다고..
몽고DB는 강력하고 유연하며 확정성 높은 데이터베이스다. 몽고DB의 특징에 대해 알아보자. 1. 손쉬운 사용 몽고DB는 관계형 데이터베이스가 아니라 도큐먼트 지향 데이터베이스다. 관계형 모델을 사용하지 않는 주된 이유는 분산 확장(Scale-out)을 쉽게하기 위함이지만 다른 이점도 있다. 도큐먼트 지향 데이터베이스에서는 행 개념 대신에 보다 유연한 모델인 document를 사용한다. 내장 도큐먼트와 배열을 허용함으로써 document 지향 모델은 복잡한 계층관계를 하나의 레코드로 표현할 수 있다. 이 방식은 최신 객체 지향 언어를 사용하는 개발자의 관점에 매우 적합하다. 또한 몽고DB에서는 도큐먼트의 키와 값을 미리 정의하지 않는다. 따라서 고정된 스키마가 없다. 고정된 스키마가 없으므로 필요할 때마다..
아키텍처 아키텍처를 설계할 때 출현하는 전형적인 영역은 그림과 같은 4가지 영역 표현, 응용, 도메인, 인프라입니다. - 표현 계층은 흔히 Controller로 불립니다. 어플리케이션의 최상단에서 유저 또는 웹 요청을 받고 응용계층에 로직을 위임하고 적절한 응답을 합니다. - 응용 계층은 Service로 많이 불리는데 처리해야할 로직을 중재하는 역할을 합니다. 원래는 응용계층에서 대부분의 로직 처리가 이루어졌으나 도메인 중심 개발에서는 도메인에게 로직 수행을 위임합니다. - 도메인 모델은 일종의 객체이며 핵심 로직을 수행합니다. 또한 도메인은 식별자 값을 가진 엔티티로써 데이터베이스에 매핑됩니다. 응용 계층에서 도메인에게 메시지를 전달(메서드를 호출)하고 도메인은 해당 메시지를 적절한 행동을 실행합니다...
1. 스프링의 싱글톤 스프링은 기본적으로 Bean으로 등록된 객체를 싱글턴 방식을 사용하여 관리합니다. 예를 들어 @Bean, @Controller, @Component 등의 어노테이션이 붙은 Bean들은 스프링 컨테이너가 실행 시점에 등록된 Bean, 컴포넌트 스캔을 하여 딱 1번만 생성됩니다. 이후에는 요청이 들어와도 새로 객체를 생성하지 않고 공유해서 쓰게 됩니다. 왜 싱글톤일까요? 이는 객체를 매번 새로 생성하면 메모리 낭비가 심하고 요청이 완료되면 객체의 참조가 끊어지며 더 빈번하게 Gabage Collecting이 일어나기 때문입니다. 예를 들어 서버로 10000명의 사용자가 요청을 보낼 시 싱글톤이 아니라면 10000개의 객체를 생성해야 하니 낭비가 심하겠죠? 당연히 싱글톤을 이용하면서의 주..
실무에서 @Bean어노테이션을 붙여 등록하는 과정을 반복하다 보면 빈을 등록하는 과정을 누락할수도 있다. 따라서 컴포넌트 스캔을 이용하여 빈을 등록하고 등록된 빈을 자동주입한다. @ComponentScan 기존과 다르게 클래스 내부에 @Bean으로 등록한 클래스가 없고 @Component 애노테이션이 붙은 클래스를 스캔한다. 또한 Component내의 의존관계 주입은 @Autowired를 사용하여 타입에 맞는 의존관계를 자동으로 주입해준다. 탐색 위치와 기본 스캔 대상 basePackages로 탐색할 패키지를 지정하여 스캔할 수 있으며 설정하지 않으면 라이브러리등 모든 자바 소스를 다 스캔하기 떄문에 시간이 오래걸린다. default는 ComponentScan이 붙은 설정정보 클래스의 패키지가 시작 위치..
웹어플리케이션은 고객이 요청을 할때마다 새로운 Controller 객체를 만들고 요청을 처리하고 반환할까? 만약 그렇게된다면 JVM에 계속해서 객체를 생성하고 반환한다. 다수의 요청이오면 엄청난 메모리 점유율과 함께 OOM이 발생할 수도 있다. 그래서 스프링 어플리케이션은 해당 객체가 1개만 생성되고 공유하도록 싱글톤 방식을 사용한다. 먼저 싱글톤 패턴에 대해 알아보자. 싱글턴 패턴 싱글턴 패턴이란 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 아래 코드를 보면 final을 선언하여 애플리케이션 실행 시점에 객체를 할당하고 getInstance를 통해 객체를 얻는 것을 볼 수 있다. private static final SingletonService instance = new S..
정상처리 및 오류처리에 대한 API 서버 공통 응답 포맷을 개발해보도록 하겠습니다. 공통 포맷을 개발하면 아래와 같은 장점이 있습니다. Api 서버는 정상, 에러에 대한 응답의 포맷이 동일하며 어떠한 응답도 공통포맷 형태로 반환하면 됩니다. Api를 사용하는 클라이언트는 공통 포맷을 보고 정상응답, 에러를 구분할 수 있습니다. 1. 응답 포맷 요구사항 공통 응답에 대한 요구사항은 다음과 같습니다. 정상, 오류처리 모두 success 필드를 포함합니다. 정상처리라면 true, 오류처리라면 false 값을 출력합니다. 정상처리는 response 필드를 포함하고 error 필드는 null 입니다. 응답 데이터는 객체로 표현됩니다. 오류처리는 error 필드를 포함하고 response 필드는 null 입니다. ..
Java를 처음 접할때 배우는 메소드임에도 잘 모르고 쓰는 경우가 많은 Equals와 Hashcode에 대해서 알아보자. 두 메소드는 모든 객체의 부모인 Object 클래스에 구현되어있다. Objcect의 구현된 소스코드를 살펴보자. // Indicates whether some other object is "equal to" this one. public boolean equals(Object obj) { return (this == obj); } Object 클래스에 구현된 equals 클래스이다. 생각보다 코드가 단순하고 객체 자체가 같은지를 비교하는 코드이다. 다음은 hashcode이다. hashcode는 따로 작성된 코드가 없이 native라는 코드가 붙어있다. /** * Returns a ha..