20210409-TIL

나영원·2021년 4월 9일
0

T.I.L.

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

오늘 할일

  • 알고리즘 문제풀이
  • 스프링 개발 실습
    • 어제 실습한 내용 디버깅 우선
  • 포트폴리오 수정
  • 채용공고 읽기

오늘 한 것 & 배운 내용

알고리즘 문제 풀이

영화감독 숌

  • 문제 해석

    • 6이 연속으로 3번으로 들어가는 수를 작은것부터 큰순서대로 나열한다고 생각했을 때 입력받은 N번째 숫자는 무엇이 될지 출력하라
  • 풀이 계획

    • 6이 3번 반복되는 가장 작은수 666부터 6이 세번 반복될때마다 counter를 ++해주어 N번째까지 반복하여 나온수를 출력한다
    • 6이 최소 3번 반복되는것을 찾기 위해 조건문을 통해 6이 나오면 다음 두수가 6인지 확인한다
  • 나의풀이

    • num과 count 변수를 선언해주고 count가 n보다 작을 때만 동작하는 while문을 만든다
    • num을 ++해주고 count를 String으로 만들어 앞글자부터 6이 있는지 확인하는 조건문을 작성한다
      • 6을 찾앗다면 뒤에 남은 숫자가 2개 이상인지 확인하고 각글자가 6이 맞는지 확인하는 조건문을 하나 더 작성한다
        • 모든 조건을 만족한다면 count++해주고 for을 빠져나온다
    • n개를 발견할때까지 반복하다가 멈추면 num을 출력해준다
    • 풀이를 정리하다가 6을 찾기전에 남은 숫자의 길이가 최소 3개 이상인지 확인하는 조건을 중복 조건문중에 앞으로 옮겨 연산횟수를 줄여주었다
  • 다른사람 풀이

    • 참고 : https://st-lab.tistory.com/103

    • 6이 3번 연속되는지 확인하기 위해 num을 String으로 변환한 후 Stirng에 contains("666") 을 사용해 포함되어있는지 확인한다

      • 위의 방식으로 풀면 구지 단어 단위로 풀지 않아도 되서 연산속도가 개선되는 걸 확인할 수 있었다
      • String으로 변환하는것 까지는 같았는데 메소드활용해서 차이가 있었던 것 같다. 연속되는 숫자는 contains()를 활용하는게 좋을 것 같다
    • 바뀐풀이

한수

  • 문제해석

    • N의 각자리수가 등차수열을 이루면 N은 한수이다
      • N이 주어질때 1부터 N까지 한수의 갯수를 출력하라
    • 1은 한수이다
  • 문제풀이

    • 등차수열의 성질인 an = a + (n -1)d 공식을 활용한다
    • 한자리수는 1이 한수인 것을 보고 1 +(1-1)1 = 1이되는 것을 확인 했으니 무조건 한수가 된다고 가정한다
    • 두자리수 또한 2개의 숫자는 당연히 등차수열이 될 수 밖에 없으니 무조건 한수가 된다고 가정한다
    • 세번째 자리수 부터 첫번째 자리수 - 두번째 자리수 한것과 세번째 자리수 한것이 같은지 반복해서 하면서 체크를 해주면 될 것 같다
  • 나의풀이

    • 처음엔 등차수열의 공식을 사용해보려고 했지만 한자리수와 두자리수가 모두 한수가 되는 것을 확인한 후 가장 큰 수는 예외로 처리해주고 세자리수만 비교해주면 되는 것으로 생각해보니 훨씬 간단하게 풀 수 있을 것 같았다
      • 1000은 한수가 아니고 예외 수이기 때문에 맨처음에 n을 입력받아 값이 1000이면 -1을 해주어 999로 만든다
    • for문을 1~n까지 돌린후에 i/100 이 0이거나 i/10이 0이면 두자리수와 한자리수이니 count ++를 한다
    • 이후의 숫자는 모두 세자리 수이니 first , second, third 변수를 선언하고 각각 자리수별로 값을 입력받아 fist - second == second -- third 조건을 통과하면 등차수열이 되니 count++ 한다
    • 반복문이 완료된후 count를 출력한다
  • 다른사람풀이

    • 참고 : https://rightbellboy.tistory.com/38

    • n이 100 미만이라면 체크할 필요 없이 무조건 n을 출력하면 됬다

      • 어차피 모든 숫자가 한수이기 때문이다
      • 100 이상이라면 count += 99 해주고 시작하면 되는 것이었다

스프링 예제 실습

EC2 서버에 스프링부트 배포

  • 드디어 길고 길엇던 디버깅을 마치고 이번 파트를 정리를 시작한다

    • 디버깅하면서 그냥 따라치던 코드들을 많이 이해할 수 있어서 많이 배운 시간이었다
  • 참고 : https://velog.io/@swchoi0329/EC2-%EC%84%9C%EB%B2%84%EC%97%90-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EB%B0%B0%ED%8F%AC

  • EC2에 프로젝트 Clone 받기

    • EC2 서버에 git을 깔고 내프로젝트를 clone 해온다
      • 생각해보니 서버에도 당연히 git을 깔수 있고 거기에 clone해서 가져올 수있는 것인데 이런 생각은 못해봤다..
      • 이렇게 코드를 가져 다 놓으면 거기서 지지고 볶고 다할 수있으니 알아두는게 좋은 것 같다
    • chmod +x ./gradlw 로 실행 권한을 추가한다
      • 리눅스 환경에서는 이렇게 권한을 추가해주는 작업들이 동반되는데 알아두면 도움이 될것 같다
    • ./gradlew test 명령어를 통해 단위 테스트를 실행한다
      • build를 하려면 사전에 test를 통과해야되니 미리 테스트부터 돌려보는 것 같다
      • push하기전에 항상 모든 테스트를 통과 시켜놓는게 중요하다는 것을 다시한번 생각하게 된다
  • 배포스크립트 만들기

  • 외부 Security 설정 파일 등록

    • oauth관련 yml파일은 git으로 clone해온 내용에 포함이 되어 있지 않기 때문에 따로 작성해주어야 한다
    • application-oauth.yml파일을 만들고 프로젝트에서 내용을 복사해서 붙여넣으면 간단히 작성할 수 있다
    • 마지막으로 deploy.sh 파일을 수정하여 nohup으로 jar파일을 실행시킬 때 Dspringconfig.location이라는 옵션으로 yml파일들에 위치들을 쭉 추가해주면 설정파일들을 인식하게 된다
      • 이 부분은 지난 프로젝트에서 어려움을 겪었던 문제로 결국 위와 비슷하게 해결했지만 Dspingconfig 옵션을 어디에 걸어야 되는지를 몰라서 Application.java 파일에 설정으로 파일 위치를 잡아주었었다..
      • 여러모로 이 실습을 먼저진행하고 프로젝트를 진행했으면 훨씬 깔끔하게 진행됬을 것 같다
  • 스프링 부트 프로젝트로 RDS 접근하기

    • RDS는 실제 상용 DB라고 생각하고 진행하고 있으니 jpa에서 자동으로 설정해주는 테이블이 아닌 쿼리문을 통해 직접 테이블을 작성한다
      • 또한 프로젝트 설정에서 ddl-auto 옵션을 none으로 해서 혹시라도 자동으로 ddl문이 발생하지 않도록 예방한다
        • jpa수업에서 배운내용이지만 DB 생성은 중요한 문제이니 상용 DB는 직접 테이블을 작성하고 ddl도 발생하지 않는다고 한다더니 실제로 그렇게 하는 모습에서 인상 깊었다
    • application-real.yml을 따로 작성하여 서버 배포시 사용할 설정파일을 따로 작성한다
    • application-real-db.yml도 작성하여 db 설정 또한 따로 해준다
      • db정보 또한 oauth처럼 공개되면 안되는 정보들이 담겨있기 때문에 real.yml에 포함시키지 못하는 정보만을 따로 빼서 작성하게된다
    • 마지막으로 deploy.sh에 nohub으로 jar실행시키는 옵션에 만들어준 yml파일에 위치를 모두 추가해준다
      • classpath:라고 하면 /src/main/resources로 인식을 한다
  • EC2에서 소셜 로그인 설정

    • ec2에 퍼블릭 dns를 각각 구글과 네이버의 api서비스 관리하는 곳에 callback주소로 추가해준다
  • 설정파일 group으로 관리

    • spring 2.4.x가 되면서 spring.profiles.include를 사용하는 것이 아닌 spring.profile.group: xx, yy, zz 을 통해 그룹을 묶어서 설정파일들을 사용하도록 변경되었다
      • 그래서 spring.profile.local : oatuh와 spring.profile.real: real, reald-db, oauth를 만들어서 로컬환경에선 local로 해놓고 실행하고 EC2환경에서는 real을 사용해서 구동을 하게 된다
        • EC2에서는 -Dspring.profiles.active=real 이란 옵션을 통해 real그룹에 설정파일들을 활성화 할 수 있다
        • 로컬에서는 아래 그림과 같이 IDE에 Run/Debug Configuration에 Ative profiles에 group명을 적으면 해당 설정 파일들을 활성화 할 수 있다

runconfg

  • 배운점

    • 가장 실습하면서 디버깅이 오래걸린 파트이지만 그만큼 서버 배포에 대해서 정말 많이 배운 파트여서 만족도가 높다
    • 가장 기본적인 jar파일과 스크립트 파일을 이용한 서버 배포를 실습해볼 수 있었고도움이 많이 되었고 배포시 git에 올리지 않는 설정 파일들을 어떻게 포함시킬 것인지까지 알 수 있어서 좋았다
      • 지난번 프로젝트 때 진행한 것을 보니 GithubAciotns와 CodeDeploy를 이용해 배포했었는데 CodeDeploy를 이용해 배포를 하더라도 appspec.yml에 배포과정에서 사용할 쉘스크립트들을 설정하는데 실습에서 했던 것과 같이 배포하는 스크립트를 작성해주면 오늘 배운것들을 지난번 프로젝트에도 적용할 수 있을 것 같다
    • 마지막으로 설정파일을 테스트환경과 배포환경에서 따로 관리해주어야 하는데 어떻게 profiles.group을 통해 효과적으로 관리할 수 있음을 배웠다.

GitFlow

  • 학원 동료가 GitFlow에 release기능에 대해서 질문을 해와서 나도 다시 복습할겸 git/github 강의를 다시 보고 실습하였다

    • giflow init으로 main과 develop으로 나눈다
    • develop에서 git flow feature start 를 통해 개발 브랜치를 만들어 작업한다
    • git flow featurue finish를 통해 develop으로 merge한다
    • git flow release start version~을 통해 relase를 시작한다
    • 필요한 작업 후에 release finish를 통해 작업을 마무리한다
      • 이때 tag를 작성할 vi 화면이 뜨고 태그 작성이후 각각 main과 develop으로 merege가 된다
        • tag는 간단히 어떤내용들이 업데이트 됬는지 적어놓는 것이다
    • 마지막으로 remote로 main/develop 브랜치를 각각 push해준다
  • 추가로 협업시 해야하는 플로우에 대해서도 다시 복습하였다

    • 1) 팀장이 레포만들때 giflow init으로 develop과 main을 분리한다
    • 2) 팀원이 팀장 레포를 folk해서 clone해오면서 main branch만 있는 상황이니 gitflow init을 해서 develop을 만든다
    • 3) git flow feature statt finish를 통해 기능 개발을 하고 본인의 develop으로 먼저 머지한다
    • 4) 팀장의 develop에서 pull을 해서 confilict가 발생하는지 먼저 확인하고 해결한다
    • 5) 변경 내용을 본인의 develop 브랜치로 push를 한다
    • 6) 팀원의 develop브랜치에서 팀장의 develop 브랜치로 풀리퀘스트를 보낸다
  • 초기설정이는 프로젝트 처음에만 하고 release는 팀장이 아니면 하기가 어려우니 까먹고 있다가 이번기회에 다시 복습을 하게되서 도움이 되었다

사담

  • 오늘 solved.ac에 등급이 silver2로 올라가서 기분이 좋다
    • 등급보다 낮은 난이도에 문제들을 풀다보니 경험치 쌓는게 오래걸려 더 오랜만에 한 등급업이라 더 기분이 좋다
    • 등급이 실력을 검증해주진 않지만 그래도 성실함을 보여줄 수 있는 지표이기 때문에 더 열심히 해서 또 등급을 올리고 싶다

내일 할일

  • 스프링 개발 실습
  • 프로젝트 모임
  • 알고리즘 문제풀이
profile
배우는 개발 일기
post-custom-banner

0개의 댓글