본문 바로가기

전체 글112

[Java] Java는 Call by reference가 없다 Call by Value와 Call By Reference가 뭘까? 프로그래밍을 하다 보면 꼭 알고 넘어가야 하는 개념이 있습니다. 바로 Call By Value, Reference입니다. 어떤 언어를 공부하든 나오는 개념이기도 합니다. Call by value란, 값을 호출하는 것을 의미합니다. 전달받은 값을 복사하여 처리합니다. 즉 전달받은 값을 변경하여도 원본은 변경되지 않습니다. Call by reference란 참조에 의한 호출을 의미합니다. 전달받은 값을 직접 참조합니다. 즉 전달받은 값을 변경할 경우 원본도 같이 변경이 됩니다. Java에 Call by reference가 있을까? 우리는 Java에서 객체를 전달받고, 그 객체를 수정하면 원본도 같이 수정되니 이것이 Call by refere.. 2020. 3. 24.
로드밸런서의 종류와 동작방식 로드밸런싱이 왜 필요할까? 서버가 단 하나만 존재할 때 수천만명의 사람들이 서버에 동시 접속하면 어떻게 될까요? 하나의 서버는 부하를 감당하지 못할 수도 있을 것입니다. 이를 해결하는 방식에는 장비를 업그레이드하는 Scale-up방식과 장비를 여러개 두는 Scale-out방식이 있습니다. Scale-out 방식으로 여러 서버를 둔다면 해당 서비스에 접근하기 위해서는 서버마다 존재하는 다른 IP가 필요할 것입니다. 서버마다 다른 공인 IP를 부여한다면 사용자들마다 각각 다른 IP로 접속할 것이고, 개발자가 원하는 방식대로 부하를 분산하기 어려워집니다. 예를 들어 100명의 사용자가 존재하고 2대의 서버가 있다면 99명의 사용자가 서버 1에 접속하고 1명의 사용자가 서버 2에 접속할 수도 있는 것이니까요. .. 2020. 3. 23.
[DB] 분산 시스템을 선택하는 삼각형, CAP 이론 CAP란 분산 시스템은 일관성(Consistency), 가용성(Availability), 분할 내성(Partition tolerance) 이라는 3가지중 최대 2가지만 만족할 수 있다는 이론입니다. RDBMS, NoSQL등 어떤 데이터베이스를 사용해야 하는지 선택할 때 해당 시스템의 특성에 따라 CAP 필요성에 대해 분석하고 그에 맞는 데이터베이스를 선택할 수 있습니다. 일관성(Consistency) - 모든 노드들이 동일 시간 동일 데이터를 사용자에게 보여줘야 하는 것 가용성(Availability) - 특정 노드에 장애가 발생해도 성공적으로 서비스를 지속하는 것 분할 내성(Partition tolerance) - 연결이 끊어져도 연속해서 동작하는 것 DBMS별 CAP CAP 이론에 따르면 분산 시스템.. 2020. 3. 19.
[Spring] 트랜잭션의 전파 설정별 동작 트랜잭션의 전파 설정이란 Spring에서 사용하는 어노테이션 '@Transactional'은 해당 메서드를 하나의 트랜잭션 안에서 진행할 수 있도록 만들어주는 역할을 합니다. 이때 트랜잭션 내부에서 트랜잭션을 또 호출한다면 스프링에서는 어떻게 처리하고 있을까요? 새로운 트랜잭션이 생성될 수도 있고, 이미 트랜잭션이 있다면 부모 트랜잭션에 합류할 수도 있을 것입니다. 진행되고 있는 트랜잭션에서 다른 트랜잭션이 호출될 때 어떻게 처리할지 정하는 것을 '트랜잭션의 전파 설정'이라고 부릅니다. 전파 설정 옵션 트랜잭션의 전파 설정은 '@Transactional'의 옵션 'propagation'을 통해 설정할 수 있습니다. 각 옵션은 아래와 같습니다. REQUIRED (기본값) 부모 트랜잭션이 존재한다면 부모 트.. 2020. 3. 4.
[MySQL] 트랜잭션의 격리 수준(isolation level) 격리 수준이란? 트랜잭션의 격리 수준이란 여러 트랜잭션이 동시에 처리될 때 서로 다른 트랜잭션에서 변경, 조회하는 데이터를 어느 수준에서 볼 수 있는지 설정하는 것 입니다. 격리 수준이 낮은 순서부터 'READ UNCOMMITTED', 'READ COMMITTED', 'REPEATABLE READ', 'SERIALIZABLE' 총 4가지의 격리 수준이 있습니다. MySQL은 데이터의 변경시 변경 전 데이터를 UNDO 영역에 저장하고, 변경된 데이터는 바로바로 레코드에 저장합니다. 그렇기 때문에 격리된 데이터를 조회할 때에는 테이블에서 바로 조회하는 것이 아닌, UNDO영역에 백업된 레코드를 가져와 조회합니다. 격리 수준에 따라 발생할 수 있는 문제점 DIRTY READ 트랜잭션에서 작업이 다 끝나지 않았.. 2020. 3. 1.
[Java] jConsole로 원격에서 실행중인 JVM 모니터링하기 서버 환경 Naver Cloud Platform(nCloud) Compact Server ubuntu 16 docker (openJDK-8 베이스 이미지로 만든 프로젝트가 올라갑니다) 프로젝트 Spring boot 2.2 maven JDK 8 모니터링 환경 Windows10 PRO Oracle JDK 8 jConsole 도커 이미지 작성 도커 이미지를 만들 때 참조하는 DockerFile을 다음과 같이 작성했습니다. FROM ascdc/jdk8 ADD delfood.jar delfood.jar ENV JAVA_OPTS="" ENTRYPOINT ["java",\ "-Dcom.sun.management.jmxremote.port=[접근할 포트]",\ "-Dcom.sun.management.jmxremote... 2020. 2. 14.
[DelFood] Ngrinder로 진행한 성능 테스트 개요 Delfood의 0.1버전을 배포하였습니다. 제가 만든 프로젝트가 실제로 트래픽을 받았을 때 어느정도의 퍼포먼스를 보여주는지 측정해보기로 했습니다. 사용한 부하 발생기는 Ngrinder입니다. 정석 대로라면 직접 Tomcat에 설치하고 각종 환경을 세팅해야 하지만 보다 간편하게 만들어져 있는 Docker 이미지를 받아 사용하였습니다. Ngrinder의 부하 발생 구조 Ngrinder는 크게 Controller, Agent 두 가지로 구성되어 있습니다. 실제 트래픽은 Agent에서 발생시키고 그 Agent를 Controller에서 관리합니다. 그림으로 보면 다음과 같이 볼 수 있겠네요. 스크립트 작성 과정 Ngrinder에서 부하를 발생시키기 위해서는 Groovy Script 작성이 필요합니다. 회원.. 2020. 2. 13.
[Delfood] CI/CD 서버 구축과 첫 배포 CI/CD의 필요성 프로젝트가 거의 완성이 되어가며 배포와 테스트 자동화의 필요성을 느꼈습니다. 이전에 했던 프로젝트는 직접 jar파일을 빌드한 후, FTP를 사용하여 서버에 올린 후 java -jar로 직접 실행시켰던 기억이 납니다. 자잘한 변경사항이 생긴다면 또다시 빌드 - 전송 - 직접 실행.. 을 반복해야 했죠. 서버에 올라간 후 문제가 없는지 직접 url을 기반으로 테스트까지 해야 했습니다. 했던 테스트를 또 반복하는게 상당히 귀찮은 일이였습니다. 최근 CI/CD의 개념을 배우며 위와 같은 귀찮은 문제를 쉽게 해결할 수 있다는 것을 알게 되었습니다. Github에 commit을 push하면 자동으로 소스코드를 통합하여주고, 배포까지 할 수 있는 편리한 툴이였죠. 바로 Jenkins였습니다. 이러.. 2020. 2. 11.
[Java] Hackerrank Two Strings 문제 두 문자열이 주어졌을 때 서로 같은 글자를 포함하는지 검사하시오. 같은 글자를 포함한다면 YES를, 포함하지 않는다면 NO를 반환하시오. 풀이 Tip : 중복 제거를 하지 않은 상태로 반복문을 돌릴 시 Timeout으로 실패 처리됩니다. 1. 문자열을 1글자씩 나눈다. 2. 나눈 글자들의 중복을 없에기 위하여 Set에 글자를 넣는다. 3. 반복문을 돌며 해당 글자를 2번 문자열이 포함하는지 검사한다. static String twoStrings(String s1, String s2) { Set set = new HashSet(); String[] c1 = s1.split(""); for (String a : c1) set.add(a); for (String a : set) if (s2.contain.. 2020. 2. 5.