목록전체 글 (78)
윤개발
이제 데이터베이스에 있는 데이터를 삭제해보자. 도큐먼트 삭제 삭제는 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로 많이 불리는데 처리해야할 로직을 중재하는 역할을 합니다. 원래는 응용계층에서 대부분의 로직 처리가 이루어졌으나 도메인 중심 개발에서는 도메인에게 로직 수행을 위임합니다. - 도메인 모델은 일종의 객체이며 핵심 로직을 수행합니다. 또한 도메인은 식별자 값을 가진 엔티티로써 데이터베이스에 매핑됩니다. 응용 계층에서 도메인에게 메시지를 전달(메서드를 호출)하고 도메인은 해당 메시지를 적절한 행동을 실행합니다...
2021 네이버 상반기 공채에 합격했습니다. 면접에 대한 상세한 내용은 보안서약을 하였기 때문에 언급하지 않고 댓글로도 받지 않겠습니다. 1. 서류전형 서류는 3개의 항목으로 되어있었고 사람인이나 채용 사이트등 에서 자소서 항목을 공개중입니다. 1번은 희망 직무를 간단하게 작성하는 것입니다. 예시 - 1) BE 개발 2)FE 개발 3)Android 개발 2번은 좋아하는 과목과 성적, 그리고 그 이유 작성입니다. 저는 아래와 같이 작성하였습니다. - 운영체제 / A+ / 운영체제의 역할과 내부 알고리즘에 대해 배울 수 있는 수업이었습니다. - 컴퓨터 보안 / A+ / 공개키 암호화 방식등의 기초 컴퓨터 보안에 대해 배울 수 있는 수업이었습니다. - 웹프로그래밍 / A+ / Node.js 를 이용하여 웹 전..
TDD 책을 읽으며 작성한 내용입니다. Test Driven Development: By Example - 저자: 캔트백 테스트 주도 개발의 궁극적인 목표는 "작동하는 깔끔한 코드" 이다. 오직 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다. 중복을 제거한다. TDD의 주문 빨강 - 실패하는 작은 테스트를 작성한다. (컴파일 조차 되지 않을 수 있다) 초록 - 빨리 테스트가 통과하게끔 만든다. (이를 위해 어떤 죄악을 저질러도 된다) 리팩토링 - 통과하게만 하는 와중에 생겨난 중복을 제거한다. 일반적인 TDD의 주기 테스트를 작성한다. 어떤식으로 나타나길 원하는지 이야기를 써내려나간다. 올바른 답을 얻기 위해 필요한 이야기의 모든 요소를 포함시켜라. 실행 가능하게 만든다. 무엇보다 중요한 것은..
자동화된 테스트를 작성할 경우에 테스트들이 의존성을 가지고 같이 실행되어야 하는 경우가 많이 있는데요. 예를 들어 사용자를 조회하는 로직을 테스트한다고 한다면 UserService에서 UserRepository, 그리고 DB까지 연결되어있습니다. UserService만 테스트하고 싶어도 이어지는 연결로 인해 독립적인 테스트가 힘들어집니다. 또한 아직 UserRepository가 구현되지 않은 경우에도 테스트가 힘들어지죠. 이런 경우에 주로 실제 객체가 아닌 단순한 객체를 이용하여 테스트하게 되는데 이를 테스트 더블이라고 합니다. 용어 자체는 제라드 메스자로스(Gerard Meszaros)가 만든 용어로, 스턴트 더블(영화 촬영에서 말하는 스턴트 대역 배우)에서 아이디어를 얻어서 만든 용어입니다. 테스트 ..
AssertJ란? Assertj는 많은 Assertion, 오류 메시지 테스트를 제공하고 테스트 코드 가독성을 향상 시키며 쉽게 사용할 수 있도록 설계된 Java 라이브러리입니다. 의존성 추가 Assertj를 사용하기 위해선 의존성을 추가해주어야 합니다. maven dependency org.assertj assertj-core 3.20.2 test (자바 7 은 2.9.1을 사용하라고 명시되어있습니다.) gradle dependency 추가 testImplementation "org.assertj:assertj-core:3.20.2" 항상 Java 버전을 확인하고 사용해주세요! AssertJ Core 3.x requires Java 8 or higher AssertJ Core 2.x requires J..
1. 스프링의 싱글톤 스프링은 기본적으로 Bean으로 등록된 객체를 싱글턴 방식을 사용하여 관리합니다. 예를 들어 @Bean, @Controller, @Component 등의 어노테이션이 붙은 Bean들은 스프링 컨테이너가 실행 시점에 등록된 Bean, 컴포넌트 스캔을 하여 딱 1번만 생성됩니다. 이후에는 요청이 들어와도 새로 객체를 생성하지 않고 공유해서 쓰게 됩니다. 왜 싱글톤일까요? 이는 객체를 매번 새로 생성하면 메모리 낭비가 심하고 요청이 완료되면 객체의 참조가 끊어지며 더 빈번하게 Gabage Collecting이 일어나기 때문입니다. 예를 들어 서버로 10000명의 사용자가 요청을 보낼 시 싱글톤이 아니라면 10000개의 객체를 생성해야 하니 낭비가 심하겠죠? 당연히 싱글톤을 이용하면서의 주..
해당 포스팅은 JUnit에서 자주 사용하는 가장 기본적인 어노테이션과 기본 테스트를 확인할 수 있습니다. JUnit 이란? 대부분의 언어는 단위 테스트를 지원하며 이를 xUnit이라고 합니다. 즉 JUnit은 java의 단위테스팅 프레임워크라고 생각하면 됩니다. JUnit은 테스트를 단순하게 System.out.print를 찍어서 확인하는 것이 아닌 메소드의 값과 결과가 동일한지, 해당 메소드가 기대한 동작을 하는지, 예외상황에서는 예외를 정확하게 반환하는지 등에 대한 테스트를 지원합니다. @(어노테이션)을 이용해서 손쉽게 만들 수 있고 AssertEquals등을 활용해 코드로써 테스트가 가능합니다. 지원되는 버전 어떤 프레임워크 또는 의존성을 사용하기 위해서는 항상 버전을 확인해야합니다. JUnit 5..
32bit와 64bit의 차이에 대해서 아는가? 32Bit CPU는 레지스터, BUS, ALU등이 한번에 처리할 수 있는 최대 Bit가 32bit이다. 따라서 MAR(Memory Address Register)도 32bit의 크기이고 이는 0~2^32 - 1 만큼의 주소값을 가질수 있다. (약 4GB)반면에 64Bit는 0~2^64 -1 까지의 주소값을 가리킬수 있는데 이는 사실상 무한이다. (16,777,216TB) 이러한 원리로 32bit는 4GB의 메모리만 처리할수 있기 때문에 메모리를 업그레이드 하여도 쓸수가 없다. 운영체제의 메모리 영역 운영체제는 부팅시에 메모리 영역의 최상단에 프로세스로 올라간다. 사용자가 운영체제 메모리에 프로세스를 할당하면 안되기 때문에 메모리 관리자는 경계레지스터를 사용..
교착상태(deadlock)이란? 2개 이상의 프로세스가 다른 프로세스의 자원을 기다리며 더이상 작업하지 못하는 무한대기 상태에 빠지는 것을 말한다. 교착상태의 4가지 조건 4가지 조건을 모두 만족하여야 교착상태이다. 상호 배제: 사용하는 자원이 공유할 수 없는 자원이여야 한다. 비선점: 하나의 프로세스가 다른 프로세스를 선점할 수 없어야 한다. 점유와 대기: 각 프로세스는 어떤 자원을 할당받고 대기상태에 있어야한다. 원형대기: 대기하는 방향이 원형을 이루어야한다.(사이클) 교착상태와 아사현상은 다르다 아사 현상은 정책적인 오류로 인해 작업이 이루어지지 않는 것을 말한다. 에이징등을 통해 해결할 수 있지만 교착상태는 자연스럽게 발생한다. 교착상태 해결법 예방 - 4가지 조건중에 하나를 무력화 하는 방법이다..
프로세스간 통신(IPC) 프로세스 내부 데이터 통신: 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우 전역변수나 파일을 이용하여 데이터를 주고 받는다. 프로세스 간 통신: 같은 컴퓨터에 있는 여러 프로세스끼리 통신하는 경우로 공용파일이나 운영체제가 제공하는 파이프를 사용 네트워크를 이용한 데이터 통신: 프로세스 소켓을 이용하여 데이터를 주고받는다. 동일컴퓨터에서 프로세스에서는 소켓을 이용하지 않는 이유 - 많은 전체리 작업이 있기 때문에 오버레드가 발생한다. 바쁜 대기 전역변수를 사용하는 방식의 가장큰 문제점으로 언제 데이터를 보낼지 몰라 반복문을 무한 실행하며 기다리는 것. ⇒ 해결하기 위해 데이터가 도착했음을 알려주는 동기화를 사용한다. 전역 변수를 이용한 통신 ⇒ 바쁜대기 파일을 이용한 통..
1. 스케줄링의 단계 고수준 스케줄링(승인 스케줄링) 시스템 내의 전체 작업수를 조정한다. 프로세스를 승인할지 거부할지를 결정 중간수준 스케줄링 활성화된 프로세스를 보류상태(또는 중지)로 만들거나 다시 활성화 한다. 저수준 스케줄링이 잘 일어나도록 완충하는 역할을 한다. 시스템의 과부하를 막는 방식 저수준 스케줄링 어떤 프로세스를 CPU에 할당하고 대기, 실행상태로 보낼지 결정하는 스케줄링이다. 순서 작업대기 ==⇒ 보류상태 ==⇒ 활성상태 ==⇒ 실행상태 ==⇒ 종료 고수준 중간수준 저수준 2. 스케줄링의 목적 모든 프로세스가 공평하고 효율적으로 작업하도록 하는 것이다. 먼저 처리해야 하는게 있으므로 일정부분 공평함을 희생한다. 3. 선점과 비선점 선점형 스케줄링: CPU를 할당받은 프로세스를 다른 프..
프로세스는 프로그램을 메모리 상에서 실행중인 것 + PCB(프로세스 제어 블록)을 생성한 것 스레드는 프로세스 안에서 실행되는 흐름 단위 프로세스 하나마다 1개 이상의 스레드를 가지고 있다. 프로세스는 별도의 주소공간을 할당받는다. 코드영역 - 요리책 데이터 영역- 요리 재료, 전역변수와 정적 변수 힙영역- 동적 할당된 데이터 스택영역 - 조리도구, 지역변수, 매개변수, 리턴 값 - 스레드가 할당받는 영역 프로세스는 자신만의 공간을 할당받아 사용하지만 스레드는 다른 스레드와 공간과 자원을 공유하면서 사용한다. PCB에는 아래 정보가 포함된다. 포인터 - 준비상태나 대기상태의 큐 구현을 위해 사용된다. 프로세스 구분자(PID), 프로세스 상태, 프로세스 우선순위, 할당 자원 정보 메모리 관련 정보 - 프로..
하드웨어는 크게 프로세서와 메모리로 분류되며 버스로 연결된다. 1. 프로세서 레지스터, 연산장치, 제어장치로 구분되며 버스로 연결된다. 레지스터 프로세서 내부의 임시 저장장치 용도에 따른 분류 전용 레지스터: 프로세서가 명령어를 수행하는데 필요한 특정 데이터를 저장하거나 읽는데 사용하는 레지스터 → PC, PSR(Program Status R), IR, MAR, MDR(M Data R) 범용 레지스터: 메모리로부터 인출한 일반데이터, 주소 혹은 ALU에서 계산된 값을 임시로 저장할 때 사용하는 레지스터들 사용자가 정보를 변경할수 있는지에 따른 분류 사용자가 운영체제와 같이 프로그램을 이용하여 정보를 변경할 수 있는 데이터레지스터, 주소레지스터 등을 의미한다. 사용자가 조작 불가능한 프로세서 상태나 제어레..
실무에서 @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 입니다. ..