오늘은 어제 해설 강의를 들었다. 고로 어제 맞췄다고 했던 try-with-resouce를 비롯하여 몇몇개를 작성해볼예정이다.문제는 6문제로 어제 맞췄다는 문제까지 총 7문제를 준비하였다. 이제 얘네를 한번 공부해보자.try with resources - 이거 같은 경우에는 자바7에 들어온 개념으로 외부에서들어온 자원들을 자동으로 정리해주며, AutoCloable을 사용한 객체를 자동으로 제거를 해주는것으로 알고 있습니다.라고 대답했었다.try-with-resources는 Java 7에서 도입된 기능으로, AutoCloseable 인터페이스를 구현한 자원을 try 구문 안에 선언하면, 해당 블록이 끝난 후 자원이 자동으로 close됩니다.근데 고민이 되는 포인트가 외부자원은 I/O를 통해 데이터가 들어오..
오늘 국비에서 모의 면접을 진행하였다.나는 6개중 제대로 알고있는건 한개라고 하셨고 나머지는 개념정도는 알고있는 수준이라고 하셨다.그리고 성능적인 측면도 고려해서 공부를 해보라고 하셨다.다음은 내가 질문을 받은 내용들이다.try with reouces (이건 pass 나중에 정리예정임)String vs StringBuffer vs StringBuildervolatile제네릭 > 타입이레이저인티저캐시auto boxing, unBoxing 이렇게 질문을 하셨고 4,5번은 애초에 틀리라고 낸 문제라고 하셨다.1번은 내가 알고 있기때문에 패스하고 2번부터 6번까지 다시 공부 예정이다.일단 2번은 알고는 있었지만 너무 장황하다는 평가를 받았다.애초에 초기화 방식을 여쭤본것이 아닌데 나는 초기화 방식도 말했다. 그..
자바를 공부하면서 제일 중요하다고 생각하는 부분이 JVM이라고 생각하다.그렇다고 그전에 작성한 글을 똑같이 작성하는 건 아니구 JVM이 왜 중요하는지 부터 생각을 해야 한다.사실 JVM자체가 중요한건 아니구 자바 전역에 퍼져있는 개념이 JVM이기 때문이다.예를들어 쓰레드만 봐도 얘를 이해를 하려면 JVM을 이해를 해야한다고 생각한다.그 전에도 말했듯이 쓰레드는 JVM내에서도 스택이라는 메모리에 저장이 되어진다. 알다시피 스택은 LIFO로 나중에 들어온 친구가 먼저 나가는 형태다. 결국 쓰레드는 자동적으로 제거가 되어진다. 그런데 문제는 쓰레드는 객체끼리 공유가 되어진다. 그렇다면 쓰레드는 어떻게 객체끼리 공유를 할 수 있는 걸까? 바로 쓰레드 로컬이라는 것으로 공유를 할 수 가 있다. 쓰레드 로컬을 잘 ..
자바에서 제일 중요하다고 할 수 있는 부분은 어디일까?바로 JVM이라 생각한다. 아직 완벽하게 그릴수 있는건 아니지만 이제 대충은 설명할 수 있을거 같다.요게 내가 학습한 이미지다. 가장 어려운건 쓰레드인데 쓰레드는 스택이라는 메모리에 저장이 되어진다.스택은 메소드나 실행정보가 저장이 되어지는데 쓰레드도 여기에 저장이 되어진다.그럼 스택이라는 영역은 어디에서 나온 영역인가 바로 JVM의 영역이다. JVM에는 다양한 영역이 존재하는데스택, PC 레지스터, 네이티브 영역, 힙 영역 이렇게 나눠진다. 자바 8이전에는 클래스정보를 힙메모리에 저장을 시켰었다. 그러다 보니 이 정보들을 GC가 제대로 처리하지 못해 OOM이 자주 발생했다고 한다.그래서 자바 8이전에는 pagment라는 영역에서 저장을 하고 있었는데..
프로젝트를 진행하면서 고민이 생겼다. 어떤 DB를 사용해야 하는걸까?DB를 선택할때 아무생각없이 MySql를 선택해도 되는걸까?아닌거 같다.우리 프로젝트가 어떤 특징을 가지고 있는지 생각해봐야 한다고 생각한다.내가 알기로는 위 DB의 특징들은 대용량 트래픽 환경에서 많이 사용하는 걸로 알고 있다.그러면 어떤 차이가 있길래 두 DB중 어떤 DB를 사용해야 하는 걸까?일단 postgres같은 경우는 쓰기 작업이 많을때 유리하고 mySql같은 경우는 일기 작업이 많을때 유리하다고 한다.그렇다면 우리 프로젝트는 쓰기작업이 많을까? 읽기 작업이 많을까?우리 프로젝트는 모임관련 서비스다. 내가 맡은 부분은 티켓팅을 하는 부분이라 해당 세션을 읽어서 적용하는 경우가 많을거 같다.그렇다면 mysql을 선택하는 것이 좋..
어쩌다보니 팀원이 전부 남자다.. 어쩌다 보니... 왜... 이렇게 된거지...음... 암튼 생각보다 잘 진행이 되고 있는거 같다. 인프라 설계도도 나름 잘 만들었다고 생각하는데 잘모르겠다.일단 설계도는 다음과 같다.부족한 부분이 많을 수도 있곘지만 이 정도면 나쁘지는 않는느낌이다.아직 피드백을 받지는 않았지만 딱히 크게 지적할 부분은 없을거 같다.다음은 ERD다.테이블이 무려 21개가 나왔다. 내가 담당한 도메인이 6개나 나오긴 했지만.. 그걸 뺀다고 해도 15개... 생각보다 많이 나온거 같다.ERD는 크기가 커서 작성하지는 않았지만.. 뭐.ㅎㅎ 이제 바로 개발을 시작할거 같은데. 빠르게 진행하자.!!
1차,2차가 끝나고 3차 프로젝트가 시작이 되었다.어떤 프로젝트를 하면 대용량 트래픽을 경험할 수 있을까?이건 끼워맞추기라고 생각한다.처음엔 스트리밍 사이트를 만들고 싶다고 말씀드렸고이거에 대해 튜터님께 질문을 드렸더니 매력적이고 괜찮다고 하셨는데 이 기술을 사용하는 곳이 있는지도 생각을 해보라고 하셨다. 물론 서사같은것도 만들어서 질문을 드렸다.암튼 곰곰히 생각해보니까 이건 특정 도메인에만 국한되었기 때문에 특별하게 매력적으로 보이지는 않았다.그래서 나온것이 대규모 IT 모임 사이트다. 우리가 벤치마킹할 사이트는 '멋쟁이 사자들'이라는 대학생 동아리로많은 인원을 수용?하는 IT서비스다. 근데 세션관리같은 경우 디스코드나 다른 플랫폼을 통해 진행이 되는걸로 알고 있다.만약, 이를 제공한다면 좋지 않을까 ..
내가 저번에 재고 시스템에 동시성 적용하기 (1) 관련해서 글을 작성적이 있었다.그때는 재고를 하나만 수정하는 API이기 때문에 데드락이 발생할 가능성은 적었다.하지만 최근에 API를 추가하게 되었다. 고것은 { "stocks": [ { "id": "1b332d6b-fa61-44fa-99b4-3f1c47bbced8", "productQuantity": -5 } , { "id": "8f889c3d-a233-4716-b94a-b854d6265ea8", "productQuantity": 10 } , { "id": "c01cccdb-78a9-4328-ba52-70b3edb2f40d", "productQuantity": -2 ..
프로젝트가 끝나고 리펙토링을 진행하였다. 그리고 프로젝트 고도화를 위해 어떤것을 할 수 있을지 고민해봤다.일단 내가 맡은 도메인으로 진행을 하는것이 좋을거 같다는 생각이 들었다. 여러가지가 있었지만 그중에서 내가 선택한것은 제고 쪽이다. 현재 동시성을 제어하기 위해 비관적락을 사용해놓은 상태다.비관적락에 대해 복습해보자면 비관적락은 락을 앞단에서 거는거라 생각하면 좋다. 그러니까 DB에서 조회되기전에 락을 걸어서 동시성을 제어하는 방법이라고 생각하면 된다. 그렇다면 왜 비관적락인가를 생각해보면 내가 객체라고 말한적이 있었는데 잘못 말했구 DB다.그러니까 DB는 좀 자기주장이 좀 강한 친구라고 생각하면 이해하기 쉽다. 그리고 비관적락은 외부에서 받은거라 생각하면 된다. 즉, 자기주장이 강하니까 외부에서 처..
클린코드.. 이거만큼 학습하긴 어려운건 없을거 같다. 쉬우면서 어렵고 알거 같으면서도 막상하려고 하면 쉽지 않는 뭐 그런느낌이다.내가 생각할때, 고도화보다 더 중요하다고 생각한다. 왜냐하면 코드를 깨끗이 작성하게 되면 추후 확장성도 증가 할 수 있기 때문이다.코드가 과도하게 비대해지면 결국엔 나중에 수정하려고 하면 어떤걸 수정을 해야 하는지 잘 모르는 경우도 많다고 생각한다.그렇다고 해서 이게 습관화가 되어 있지 않기 때문에 나중에 해야지 하면 결국엔 또 안하게 될거 같다.클린코드 책을 보면 다음과 같은 제안을 하였다. 1. 생성자를 중복 정의할 때는 정적 팩토리 메서드를 사용한다.2. 함수는 작게 만들어라!3. 함수는 한 가지만 해라!4.함수 인수 - 플래그 인수는 추하다.5.반복하지 마라! a.k.a..
외부에서 SQL문법을 넣어 공격하는 기법으로개발자가 예상치 못한 결과를 야기시킬 수 있다.예를들어, 로그인을 시도해야 하는경우 id에 admin을 입력하고 password는 모르는 상황에서로그인이 되게 하려면 --를 붙이면 Sql공격이 가능해진다.보통 SQL문을 작성할때 select * from table where user_id = 'admin'인데 여기다가--은 SQL에서 주석을 뜻하기 때문에 뒤 문장들은 모두 주석처리가 되어진다.그렇게 되면 아이디만 입력해도 로그인이 가능해진다.여기에는 -- 말고도 'or 1=1' 이런 쿼리를 넣거나 다양한 방법으로 공격이 가능하다.그렇다면 이것을 막는 방법은 무엇이 있을까?1. SQL에 해당하는 모든 특수 문자를 막는 방법2.preparestatement로 전달 ..
어제 대략적인 도커학습을 마치고오늘은 Dockerfile에 대해 학습을 하려고한다.내가 잘못알고 있던 부분이 인텔리제이에서 Dockerfile을 run하게 되면 실행이 된다고 생각했다.하지만 아니었다. 이 행위는 단순히 이미지를 만드는 행위이기 때문에 실제로는 실행이 안된다고 했다.그러면 의문이 있다. 도커파일로 도커파일을 어떻게 만들 수 있을까? 나는 단순히 실행 버튼을 눌러서 해결했었는데이거는 아닌가?아닌거 같다.이미지 빌드 방법은 다음과 같다고 한다.표준적인 도커파일 빌드 명령어는 다음과 같습니다:docker build -f Dockerfile -t {도커이름} .여기서:-f Dockerfile: 빌드에 사용할 Dockerfile 지정 (기본값이라 생략 가능)-t my-app: 이미지에 이름 태그 ..