20210319-TIL

나영원·2021년 3월 20일
0

T.I.L.

목록 보기
125/145
post-custom-banner

오늘 할일

  • 기업선정 해서 지원하기
  • 알고리즘 문제 풀기
  • 기술면접 준비

오늘 한 것 & 배운 내용

알고리즘 문제 풀이

평균은 넘겠지

  • 내풀이
    • 평균을 구해서 평균보다 각각의 점수를 비교해서 평균보다 높이나온사람의 숫자를 구해 전체학생수로 나누어 그비율을 구했다
    • 문제는 소숫점 3번재자리에서 반올림하는것인데 어떻게해야할지 몰라 검색해서 찾아보았다
      • Math.round(비율 *1000)/1000 위와같이하면 소숫점 3번째자리까지 구할 수 있었다
      • 하지만 40.0 같은경우는 40.000같이 표기가 안되는 문제가 있었다
        • 그래서 DecimalFormat이라는 클래스를 사용해서 문제를 소숫점자릿수를 표현해주었다
        • 생성할때 포멧형식을 지정해주는데 "#.###" 이런식으로 하면 0인 값을 제대로 표현해주지 못해 "0.000" 이런식으로 표현해주어야 한다
  • 다른사람풀이
    • 다른풀이를 보니 간단하게 System.out.printf("%.3f%%\n",(count/N)*100) 이런식으로 소수점을 표현해주었다
      • 사실 나도처음엔 이 문법을 생각했는데 반올림까지 해주는지 잘기억이안나 검색하다 Decimalforamt으로 간거라.. 앞으론 이렇게 풀어봐야 겠다
    • 참고 : https://st-lab.tistory.com/51

수 정렬하기

  • 내풀이
    • 값을 차례대로 입력받아 배열을 만들고 배열을 ArraysSort를 사용해 정렬한 후 차례대로 출력하였다
    • 처음에 System.out.println으로 출력하였을 때 성능이 좋지 않아 BufferedWriter로 교체했는데 훨씬 좋은성능을 보여줬다
    • 직접 작성을 연습하기 위해 class선언부터 시작하여 import도 먼저 작성하고 API사용기 등을 연습해보았다
  • 다른사람 풀이
    • 카운팅 정렬방법을 사용한 방법이 더빠르다고 해서 실제로 사용해보도록 하였다
      • 카운팅 정렬은 새로운 배열을 만들어 해당 배열의 index를 값처럼 사용하는 것이다
      • Arrays.sort를 쓰지 않고도 정렬을 할수 있는 좋은 방법을 찾은 것아서 만족스럽고 다음에 활용해보고 싶다
    • BufferWirter를 사용한 방법보다 StringBuilder를 사용한 방법이 더빠른 예시가 있던데 다음에 사용해봐야겠다

셀프 넘버

  • 내풀이

    • 이전에 풀었던 부분합에서 파생된 문제여서 비슷한 방식으로 풀었다

    • 먼저 boolean[]을 만들어 각 값이 생성자가 있는지 확인할 수 있도록 한다

    • N - (k1,k2,k3..) = k 가 있다면 k번재 배열을 true로 바꿔준다

    • 전체 배열을 돌면서 false인 배열의 index만 출력한다

      • 이렇게 출력하고 결과를 봤더니 시간이 거의 1초가까이 나와서 한가지 조건을 더 추가하였다
    • k의 범위를 N-(9*k의 자릿수) 해주어서 조건을 줄여준다

      • 9*k의 자릿수는 N-(k1+k2..)에 최소값을 구해주는 조건으로 for문의 범위를 줄여주는 역할을 한다
    • 문제를 풀다보니 점점 눈에 익은 문제도 생기고 해결방법도 조금씩 터득해가는 느낌이 들어서 기분이 좋다

  • 다른풀이

    • 대부분 비슷하게 풀이를 하였다

단어 공부

  • 내풀이
    • Map을 만들어 알파벳은 Key로 하여 나올때마다 이전value를 불러 +1을 해서 넣는 방식으로 알파벳이 몇번 나왔는지 계산한다
      • key는 .toUpperClass를 사용하여 대문자로 만든다.
      • 이전값은 없을 경우를 위해 getOrDefault를 사용한다
    • map에 KeySet을 뽑아 for문을 돌려 Key의 value 들을 비교하여 최대값을 가진 Key를 구한다
      • 같은 값이 또나온 경우 sameMax 변수에 넣어서 나중에 비교가 가능하게 한다
    • max와 sameMax가 같은 경우 ?를 출력하고 아니면 해당 key를 출력하게 한다
    • 이렇게 푸니 성능이 너무 안나와서 코드를 다시 봤지만 더이상 최적화를 하진 못했다..
      • 그래도 map을 활용한 방법은 알고리즘 수업시간에 잠깐 배운건데 기억하고 있어서 다행이라고 생각했다
  • 다른사람 풀이
    • 아스키 코드를 이용하여 배열에 값을 증대시키는 방법으로 문제를 풀었다
      • 사실 이방법은 처음에 생각했는데 계산이 복잡해보여서 포기하고 map을 선택했는데 오히려 map쪽이 더 복잡했나보다
      • 다음 문자열 문제는 아스키코드를 이용해서 풀어봐야 겠다
    • 참고 : https://st-lab.tistory.com/64

2007년

  • 내풀이
    • 입력값을 입력받아 연과 월로 구분한다
    • 월별 날짜가 적힌 배열을 하나 만든다
    • 월-1일만큼 반복되 반복문을 통하여 해당날짜를 배열에서 뽑아 총날짜에 더해준다
      • 아까 입력받은 일도 총날짜에 추가한다
    • 요일 배열을 만든다
      • 1월 1일이 월요일이니 1번째배열에 월요일이 들어갈 수 있게 한다
    • 요일 배열에 index를 총날짜 %7을 하여 출력한다
  • 다른 사람 풀이
    • 대부분 비슷하게 풀어서 넘어가기로 했다

그대로 출력하기2

  • 내풀이
    • Scanner로 비슷한 유형의 문제를 풀었어서 이번에는 BufferReader로 풀기로 하였다
    • 먼저 readLine을 했는데 읽을게 없으면 어떻게 나오나 console에 찍어봤는데 null값이 나오는 것을 확인하였다
    • 맨처음엔 while문으로 돌려보고 싶었으나 Scanner에 hasNextLine 같은 메소드가 없는 것 같아서 for문으로 다시 만들어서 null이 나올때까지 출력하였다
  • 다른사람풀이
    • 대부분 Scanner에 HasNextLine을 사용했고 내가 한것보다 코드가 훨씬 짧고 간결하게 나온것이 장점인 것 같다
      • 성능 비교위해서 위의 예제를 돌려보았더니 BufferedReader쪽이 잘나와서 가독성이냐 성능이냐에 따라 결정하면 될 것 같다

채용공고 읽기 & 이력서 작성

  • 오전에 어제 작성하던 기업에 이력서를 마무리하여 제출하고 한군데 더 봐둔곳에 이력서를 수정해서 작성하였다

    • 일단 제출하고나니 결과가 어떻게 될것인가에 대한 걱정에 마음속에 편하지가 않다..
      • 이제 시작점에 온거고 어딘가에 합격해서 입사할때까지는 이 긴장감이 유지될 것 같다
  • 오후에 로켓펀치로 하나 더 지원 했는데 기존의 자유이력서에서 양식이 있는 이력서로 작성하려니 편하면서도 또 까다롭게 느껴졌다..

    • 그래도 다양한 양식을 활용하면서 어떤게 괜찮은지 찾아보는 것도 좋은 방식인것 같다
  • 지원하고 싶은 기업이 있는데 아쉽게도 경력직밖에 뽑지 않는다... 그래도 경력직이어도 넣어보라는 여러 조언들이 있었기 때문에 일요일에 정리해서 이력서 제출이라도 해볼 계획이다.

  • 요즘 지원하느라 정신없어서 자세히 보지 못했지만 기술 스택에 모르는 기술이 있다면 정리하는 것을 지속하고 튜토리얼이라도 사용해보면서 면접때 이야기라도 해보면 좋을 것 같다

기술면접 준비

  • 기술면접 준비를 어떻게 할까 고민하다가 '백엔드 기술면접'이라고 치니 예상 질문과 답변들이 정리되어 있었다
  • 잠깐 쉬는시간에 옥상에 올라가서 바람쐬는데 기술면접 질문들이 떠올라서 면접보듯이 이야기해보았는데 어느정도 이해했는지도 점검할 수 있고 말하는 것도 교정할 수 있어서 도움이 됬다. 저녁시간 활용해서 기술면접 준비하고 중간중간 올라가 면접 연습도 하면 효과적으로 준비할 수 있을 것 같다

AOP

  • AOP 는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 과점을 기준으로 각각 모듈화하겠다라는 뜻
    • 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.
    • 핵심 적인 관점은 우리가 적용하고자 하는 핵심 비지니스 로직을 뜻하고 부가적인 관심은 핵심 로직을 실행하기 위해 행해지는 데이터베이스 연결, 로깅, 파일 입출력등을 예로 들 수 있다
  • 소스 코드상 다른 부분에서 계속 반복해서 쓰는 코드들을 흩어진관심사(Crosscutting Concerns)라 부르는데 이 것들을 Aspect로 모듈화하고 핵심 비지니스 로직에서 분리하여 재사용하는 것이 AOP의 취지이다.
  • AOP 주요 개념
    • Aspect : 부가기능을 모듈화 한 것
    • Target : Aspect를 적용한 곳
    • Joinpoint : Advice가 지정될 지점(언제 사용해야되는지), Spring에서는 메소드만이 Joinpoint로 제공된다
    • Advice: 실질적으로 어떤일을 해야되는지에 대한것 - > 실질적인 부가기능을 담은 구현체
      • 5가지 종류
      • Before : 타겟 메소드가 호출되기전에
      • After : 타겟 메소드가 호출된 이후에
      • AfterReturning : 타겟 메소드가 정상적으로 반환값을 return한 후에
      • AfterThrowing: 타겟 메소드가 에외를 발생시킨 이후에
      • Around : 타겟 메소드가 호출되기 전 후로
  • Spring에서는 타겟팅을 하는 표현식을 어노테이션으로 표현이 가능하다
    • Custom 어노테이션을 만들어 해당 어노테이션이 달린 메소드에만 실행이 되록하는 방식
  • 참고 자료

웹 서버와 WAS(Web Application Server)

  • 웹 서버는 정적 컨텐츠(html, css, js)를 제공하는 서버

    • ex) Nginx, Apache
    • 동적인 컨텐츠 제공을 위한 요청을 전달 하여 받은 응답을 다시 클라이언트에게 전달 하는 역할
  • WAS는 DB 조회나, 어떤 로직을 처리해야 하는 동적인 컨텐츠를 제공하는 서버

    • ex)Tomcat , Jeus
  • 정리하면 웹서버와 WAS의 차이점은 어떤 타입의 컨텐츠를 제공하고 있느냐

    • WAS는 정적인 컨텐츠도 제공할 수 있기 때문에 웹 서버 없이 WAS만 존재할 수 있다
    • 그런데 왜 일반적으로 WAS앞에 웹서버를 배치하는가?
  • 웹서버는 WAS가 할일을 분담해 주어 서버 부담을 줄인다

    • 웹서버가 정적컨텐츠를 제공하고 그외에 것들만 WAS가 처리하도록 한다
  • 여러대의 WAS를 연결가능

    • 로드밸런싱을 위해 WebServer를 사용
    • 오류가 발생한 WAS를 WebServer에서 이용하지 못하도록 WebServer에서 막고 다른 Was이용하는 동안 WAS 재부팅하여 사용자는 오류 감지 못하도록 함
  • WAS 환경설정 파일을 외부에 노출시키지 않도록 하기 위해서

    • 클라이언트가 연결하는 포트가 직접 WAS에 연결되어 있다면 중요한 설정파일들이 노출될 수 있기 때문에 WAS설정 파일을 외부에 노출시키지 않도록 하기 위해서 서버를 앞단에 배치하기도 한다
  • 참고자료

서버확장을 위한 두가지 방법

  • 스케일-업

    • 서버에 cpu나 Ram을 추가하거나 고성능의 부품으로 교체하는 방식을 의미
      • 하나의 서버에 처리능력을 향상시키는 방법
      • 서버 한대의 부하가 집중됨으로 장애 시 큰영향을 받을 수 있다
      • 한 대의 서버에서 모든 데이터가 처리되는 데이터베이스 서버에 적합한 방식
  • 스케일-아웃

CORS

  • CORS란

    • Cross-Origin -Resource-Sharing에 약자로 도메인이 서로 다른 2개의 사이트가 데이터를 주고 받을 때 발생하는 문제

      • CORS가 생기게된 이유는 서버 내에서 요청이 허락된 도메인에만 데이터를 주기 위해서인데 , 요청을 허락하기 위해서는 Request 헤더에는 origin이 Reponse 헤더에는 Access-Control-Alow-Origin:(도메인) 와 같은내용이 담겨야 한다
    • Get방식과 Post방식의 요청에 차이

      • Get요청은 데이터의 열람만 하지만 Post방식은 데이터의 수정을 하기 때문에 Cors에러를 발생시키는 상황에서도 문제가 발생될 수 있다

        • 요청을 받은 순간 에러를 보내지만 서버에서 수정을 일어나는 상황이 발생할 수 있다
      • 그래서 Post와 같은 경우는 Options라는 메소드로 PreFilt를 미리 보내서 요청을 보내도 되는지 미리 확인을 하게 된다

사담 & 정리

  • 오늘 회고글을 읽다가 10진수 2진수로 바꾸는 알고리즘.. 정렬알고리즘.. 도 못구현해서 라이브러리 쓰는애들이 있냐는 말을 듣고 찔렸다
    • 알고리즘 열심히 공부하면서 기본적인 알고리즘은 스스로 구현하려고 노력해봐야겠다

내일 할일

  • 스코배 참여

  • 알고리즘 공부

profile
배우는 개발 일기
post-custom-banner

0개의 댓글