그냥 기억에 남은 하루라 포스팅해본다. 어제 오후 1시쯤, 회사를 나서려고 엘리베이터를 타고 내려가던 중이었어요. 21층에 도착하니 사람들이 줄을 길게 서 있더군요. ‘뭔가 이벤트라도 있나?’ 싶어서 궁금했죠. 이전에 연예인 이장우가 회사에 와서 사람들이 몰렸던 일이 떠오르면서, 이번에도 혹시 연예인이 왔나 하고 지나쳤어요. 잠시 후, 팀 단체 톡방에 팀장님의 메시지가 올라왔어요. “회사가 매출 증대에 따른 격려 차원에서 각 팀마다 간식을 준비했다. 각 팀은 간식을 받아가라”는 내용이었죠. 그제서야 21층에 사람들이 줄을 서 있던 이유를 알았어요. 간식을 받으려고 기다리고 있었던 거였더라고요. 우리 팀도 한 분이 나가서 받아오셨고, 모두 함께 간식을 나눠 먹었답니다. 조선델리 더 부티크 오... 비싸보이..
샤드키 _id기준 hash로 샤드 인덱스 생성 db.컬렉션명.createIndex({"_id": "hashed"})sh.shardCollection("db명.컬렉션명", {"_id": "hashed"}) 여러개 컬렉션 적용 (몽고 쉘에서 실행) //적용할 컬렉션var collections = ['gmktLogisItemRegIf', 'wmsAcntrLogisItemHist', 'payEvtHist', 'gnrlItemMapping', 'logisItemHist','logisGnrlItemMpngHist','itemGthrReqInfoIf','itemExceptionLog','lnkgLogisItemHist','urcyWhoutStopIf','lnkgItemHist']; for (var i = 0; i..
MongoDB 셸 사용하기: MongoDB 셸에 접속한 후, 특정 컬렉션의 인덱스를 확인하려면 다음 명령어를 입력합니다:db.컬렉션명.getIndexes()예를 들어, users 컬렉션의 인덱스를 확인하려면:db.users.getIndexes() MongoDB Compass 사용하기: MongoDB Compass를 사용하면 GUI를 통해 인덱스를 쉽게 확인할 수 있습니다. 해당 컬렉션을 선택한 후, "Indexes" 탭을 클릭하면 현재 설정된 인덱스를 볼 수 있습니다.명령어를 통해 인덱스 확인하기: db.runCommand()를 사용하여 인덱스를 확인할 수도 있습니다. 예를 들어:db.runCommand({ listIndexes: "컬렉션명" })
명령어에 대한 설명을 좀 더 구체적으로 추가하여 Git 필수 명령어에 대한 포스트를 작성하겠습니다. 각 명령어에 대한 자세한 설명과 사용 사례를 포함하겠습니다.Git 필수 명령어: Git으로 프로젝트 관리하기Git은 소스 코드 관리 도구로, 여러 사람이 동시에 작업할 수 있는 협업 환경을 제공합니다. 이 포스트에서는 Git의 기본 명령어를 심층적으로 설명하고, 각 명령어의 사용법과 실습 예제를 통해 Git을 효과적으로 사용하는 방법을 소개하겠습니다.Git 설치하기Git을 사용하기 위해 먼저 설치해야 합니다. 각 운영 체제별로 Git 설치 방법은 다음과 같습니다:Windows: Git for Windows에서 설치 파일을 다운로드하여 설치합니다.macOS: Homebrew가 설치되어 있다면, 터미널에서 다..
스프링 프레임워크는 객체 지향 프로그래밍에서 핵심적인 디자인 패턴인 의존성 주입(DI, Dependency Injection)을 지원합니다.DI는 객체 간의 의존 관계를 개발자가 아닌 프레임워크가 자동으로 주입해주는 방식으로, 코드의 결합도를 낮추고, 유연성과 테스트 용이성을 높여줍니다.이번 글에서는 서비스 계층(Service Layer)을 DI를 활용해 설계하는 방법과, DI의 주요 방식인 @Autowired 필드 주입과 생성자 주입의 차이점을 알아보겠습니다. 의존성 주입 DI(Dependency Injection)란?의존성 주입(Dependency Injection)은 클래스가 다른 클래스에 의존할 때, 직접 생성하지 않고 외부에서 필요한 객체를 주입받는 방식입니다.이를 통해 객체 간의 결합도를 낮추..
가변인수 메서드가변인수?가변인자는 메서드의 매개변수를 동적으로 처리할 수 있도록 해준다.이를 사용하면 메서드 호출 시 전달되는 인자의 개수를 동적으로 변경할 수 있다.메서드를 호출하고자 할때 인수의 갯수가 가변적일 때 가변인수를 처리하면 손 쉽게 처리할 수 있다.public void exampleMethod(String... strings) { // 가변인자로 선언된 문자열 배열에 대한 처리 // strings는 문자열 배열로 처리됨}void sum(String... str) { for(String a:str) { System.out.println(a); }}가변인수 메서드를 호출하면, 가변인수를 담기 위한 배열이 자동으로 만들어진다.내부로 감춰야 했을 이 배열을 클라이..
추상 클래스, 인터페이스 비교공통점:타입을 정의하기 위한 다중 구현 메커니즘인스턴스 메소드(디폴트 메서드)를 구현 형태로 제공차이점:추상 클래스:추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스 > 새로운 타입 정의에 제약인터 페이스:어떤 클래스 타입에 있건 인터페이스를 정의한 클래스는 해당 인터페이스 타입 가능 취급 > 다중 상속 가능인터페이스 장점 : 기존 클래스도 인터페이스 타입이 될 수 있다.기존 클래스에도, 새로운 인터페이스를 구현하도록 하면 되기 때문에 기존 클래스도 인터페이스 타입이 될 수 있다.Comparable, Iterable, AutoCloeable 인터페이스가 새로 추가되었을 때, 자바의 수많은 기존 클래스가 해당 인터페이스들을 구현한 채 릴리즈 되었다..
상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야한다.@implSpec 사용 → 자바독 도구가 생성을 해줌public class ExtendableClass { /** * This method can be overridden to print any message * * @implSpec * Please use System.out.println(). */ protected void doSomething() { System.out.println("hello"); } }문서로 남기는 것 말고도 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅을 잘 선별하여 protected메서드 형태로 공개해야 할 수도 있다• 훅 : hook: 클래스의 내부 동작 과정 중간에 끼어들 ..
상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다상속은 캡슐화를 깨트리게 된다내부구현이 노출된다하위 클래스가 상위 클래스에 강하게 의존 및 결합이 되는 설계이다메서드 호출과 달리 상속은 캡슐화를 깨뜨린다.캡슐화 : 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다.문제 1. 상위 클래스가 어떻게 구현되느냐에 따라 하위클래스의 동작에 이상이 생길 수 있다문제 2. 다음 릴리스에서 상위 클래스에 새로운 메서드를 추가한다면?하위 클래스에서 재정의하지 못한 그 새로운 메서드를 사용해 허용되지 않은 원소를 추가할 수 있다문제 1 예시public class InstrumentedHashSet extends HashSet ..
불변클래스란?인스턴스의 내부 값을 수정할 수 없는 클래스불변클래스 예시 → String, 박싱 클래스, BigInterger, BigDecimal가변클래스보다 설계하고 구현하고 사용하기 쉽다오류가 생길 여지가 적고 안전하다클래스를 불변으로 만드는 5가지 규칙객체의 상태를 변경하는 메서드를 제공하지 않는다setter가 존재하지 않아야한다클래스를 확장할 수 없도록 한다class의 선언을 final로 선언하는 방법 존재생성자를 private으로 막아 상속을 막는다**> 정적 팩토리 메서드 사용**모든필드를 private로 선언한다시스템이 강제하는 수단을 이용해서 설계자의 의도를 명확히 드러내도록 한다.모든필드를 final로 선언한다클라이언트에서 직접 접근해 수정하는 것을 막아준다.public final로 선언..
안좋은 클래스 예시class Point{ public double x; public double y;}package-private으로 선언 후에 데이터 접근 제한자는 public 으로 선언한 경우캡슐화의 이점제공 xAPI를 수정하지 않고는 내부 표현을 바꿀 수 없다불변식을 보장하지 않는다접근자와 변경자(mutator)메서드를 활요해 데이터를 캡슐화 한다.public class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } public void setX(int x) {..
정보 은닉(캡슐화)이란?내부의 데이터와 구현을 외부로 부터 숨기는 것→ 이를 통해, A는 자신의 역할만 잘 수행하도록 하고, A를 사용하는 B는 A가 내부적으로 어떻게 수행되는지에는 알 필요가 없다정보은닉의 장점시스템 개발속도 향상 → 여러 컴포넌트를 병렬로 개발시스템 관리비용을 낮춘다. → 각 컴포넌트를 빨리 디버깅가능, 교체 용이정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움 → 다른 컴포넌트에 영향을 주지않고 특정 컴포넌트만 최적화 가능소프트웨어 재사용성 향상 → 의존성 없다면 다른곳에서 재사용 가능큰 시스템 제작 난이도 낮춘다 → 개별 컴포넌트 동작 검증 가능클래스와 인터페이스의 접근 제한자 사용 원칙모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다.톱레벨 클래스와 인터페이스에..