전체 글

전체 글

    Redis 대기열 구현 시 Race Condition 발생

    에러 발생 상황티켓 예매 오픈 시 사용자가 집중되는 상황을 고려하여 Redis를 사용해 대기열 기능을 구현하였다. 동시 입장 가능 인원을 50명으로 제한한 뒤, K6를 사용해 동시 접속자 200명 시나리오로 부하 테스트를 진행하였다. 그러나 테스트 결과 기댓값인 50명을 초과한 68명이 즉시 입장 처리되는 문제가 발견되었다.K6 부하 테스트 결과 █ TOTAL RESULTS CUSTOM immediate_users................: 68 47.033438/s waiting_users..................: 129 89.225199/s HTTP http_req_failed................: 0.00% 0 out of 197 htt..

    List와 객체지향

    List와 추상화문득 그런 생각이 들었다. List로는 왜 객체를 생성할 수 없을까? 그러니까List list = new List();왜 이렇게 객체를 생성할 수 없을까. List는 인터페이스인가? 하는 생각이 들었다. 그리고 List는 정말 인터페이스였다. public interface List extends SequencedCollection {...}생각해보면 IDE 자동완성의 아이콘도 인터페이스다 ㅋㅋ 그냥... 별 생각없이 개발했던 거임... 아무튼. List가 인터페이스인 것은 추상화와 관련이 있다.무엇을 할 것인지(요구사항)를 정의한다 - List(인터페이스)는 add, get, remove, size 같은 행동 규약만 제공한다.어떻게 구현할지는 숨긴다 - ArrayList, LinkedLi..

    자바 다이아몬드 연산자(<>): 타입 명시와 타입 추론

    List list = new ArrayList();List list = new ArrayList();위 두 가지의 객체 생성 방식은 타입을 명시하느냐, 추론하느냐의 하는 문법적 차이만 있을 뿐 객체 생성은 동일하게 된다. 그렇다면 왜 이런 두 가지 객체 생성 방식이 존재하는 것일까 다이아몬드 연산자()Java 6까지는 Generic, ArrayList 같은 객체를 생성할 때 타입을 반드시 명시해야 했다. 그러나 Java 7부터는 컴파일러가 타입을 추론할 수 있게 되어 생성자 뒤쪽의 타입을 생략할 수 있게 된 것이다. 즉, 왼쪽에 이미 타입 정보가 있으므로 굳이 반복할 필요는 없다는 의미이다. 결국 기능적 차이는 없지만 문법적으로 더 간결하고 가독성 좋은 코드를 위해 현재는 다이아몬드 연산자()를 사용하는..

    접근제어자와 캡슐화

    접근 제어자여태까지 회사에서는 객체의 멤버변수에 접근할 때 무조건 getter, setter를 사용해서 접근했다. 왜 그런지는 생각 안 하고 그냥 다 그렇게 쓰니까 그렇게 썼음. 근데 강의를 보는데 user.name 이런 식으로 닷을 써서 접근하는 거다. 나는 저런 식으로 안 썼던 것 같은데... 하고 생각만 하던 찰나에 접근제어자 강의를 들으니까 이해가 됐다.회사에서 내가 무조건 getter, setter를 써야만 했던 이유는 멤버변수의 접근제어자를 모두 private으로 설정했기 때문이었다. 멤버변수를 private으로 지정하면 다른 클래스에서 멤버변수에 직접 접근할 수 없다. 같은 클래스 내부에서만 직접 접근이 가능하며, 다른 클래스에서 직접 접근 시 컴파일 오류가 발생함. 그래서 외부에서 값을 읽..

    생성자

    this객체 내 메서드에서 멤버변수와 매개변수의 명이 동일할 때 객체의 멤버변수에 접근하려면 변수명 앞에 this.를 붙이면 된다. 여기서 this는 인스턴스 자신의 참조값을 가리킨다. 생성자생성자의 이름은 클래스 이름과 같아야 한다. 따라서 첫 글자도 대문자로 시작한다.생성자는 반환 타입이 없다. 비워두어야 한다.new 키워드를 사용해 객체를 생성할 때 마지막에 괄호()도 포함해야 하는 이유가 바로 생성자 때문이다. 객체를 생성하면서 동시에 생성자를 호출한다는 의미를 포함한다. 생성자의 장점객체 생성과 동시에 필요한 작업을 수행할 수 있으므로 생성과 생성 직후에 필요한 작업을 한 번에 처리할 수 있음.제약 : 객체를 생성할 때 직접 정의한 생성자가 있다면 직접 정의한 생성자를 반드시 호출해야 한다는 제..

    Call by Value

    자바는 항상 변수의 값을 복사해서 대입한다.int num1 = 5;int num2 = num1;여기서 num2 = num1 이 부분이 값을 복사해서 대입하는 거임. num1이라는 변수 자체가 num2에 들어가는 게 아니라, num1의 값을 읽어서 num2에 복사해서 대입하는 거임. 그래서 num1과 num2는 관계가 없음. 자바는 항상 변수의 값을 복사해서 대입한다... 참조형도 마찬가지라면 이관할 때 특정 객체를 인자로 해서 메서드를 호출하고 나면 호출 시 인자로 넘긴 객체의 값이 메서드 호출 후에 변경되는 건 대체 뭐지???지피티가 알려줌 메서드의 파라미터가 참조형 객체일 경우 파라미터에 인자로 넘긴 객체의 주소값이 들어옴. 해당 주소 값 자체를 복사하는 것.void changeName(User us..

    인텔리제이 maven package ~ does not exist error

    에러 발생 상황새로 프로젝트 환경 설정을 하면서 maven clean, install 후 프로젝트를 구동 시키는데 package ~ does not exist 에러가 났다... 다른 분과 내 메이븐 레파지토리를 비교해본 결과 다른 점도 없었고 셋팅에도 다른 점이 없었다. 문제 해결구글링해서 나오는 모든 방법을 다 써도 안 됐었음... 근데 그 방법들이 누적되면서 해결됐다1. File > Settings > Build, Execution, Deployment > Build Tools > Maven > Importing 메뉴로 들어간다.2. Automatically download의 항목 중 Source와 Documentation을 체크한 뒤 Apply 하고 OK를 클릭한다.3. pom.xml 우클릭 > M..

    test()

    test() test() 메서드는 주어진 문자열이 정규 표현식을 만족하는지 판별하고, 그 여부를 true 또는 false로 반환한다. 구문 regexObj.test(str); 매개변수 str : 정규 표현식 일치를 수행할 문자열 반환 값 주어진 문자열 str 중 정규 표현식에 일치하는 부분이 있으면 true, 아니면 false 예시 const str = '사과/수박*'; const regex = /[\\/?*\[\]]/; console.log(regex.test(str)); // -> true 위 예시의 정규식으로 test 메서드를 실행할 경우 문자열에 /, \, ?, *, [, ] 가 포함돼 있으면 true를 반환한다. str 변수의 문자열에는 /와 *가 포함돼 있으므로 true를 반환한다. Refer..