<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>makemyway-kr.log</title>
        <link>https://velog.io/</link>
        <description>개발새발</description>
        <lastBuildDate>Sun, 27 Mar 2022 08:55:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>makemyway-kr.log</title>
            <url>https://images.velog.io/images/makemyway-kr/profile/f09d1163-d06d-48f3-a92b-8d813c158f31/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. makemyway-kr.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/makemyway-kr" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[4개월여의 프로젝트 끝...!]]></title>
            <link>https://velog.io/@makemyway-kr/4%EA%B0%9C%EC%9B%94%EC%97%AC%EC%9D%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%81%9D</link>
            <guid>https://velog.io/@makemyway-kr/4%EA%B0%9C%EC%9B%94%EC%97%AC%EC%9D%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%81%9D</guid>
            <pubDate>Sun, 27 Mar 2022 08:55:09 GMT</pubDate>
            <description><![CDATA[<p><a href="https://github.com/TEAM-MAT/lockerweb">11월에 시작했던 IT대학 사물함 예약 웹사이트 프로젝트가 끝났다.</a> 이번주에 실제로 it대학 재학생들을 대상으로 신청을 진행했고, 큰 문제없이 신청을 진행할 수 있었다. 이번 프로젝트를 하면서 느꼈던 점, 배운 점을 정리해보고 개선할 점을 찾아보려한다.</p>
<h1 id="프로젝트-진행과정배운것">프로젝트 진행과정,배운것</h1>
<p>이 프로젝트의 시작과정이나 이유는 이전에 올렸던 <a href="https://velog.io/@makemyway-kr/Django-%EA%B1%B8%EC%9D%8C%EB%A7%88">https://velog.io/@makemyway-kr/Django-%EA%B1%B8%EC%9D%8C%EB%A7%88</a> 게시물에 적어놓았으니 생략하도록 한다. Django 자체에 대해서도 많이 배웠지만, 여타 기술적인 것들은 충분히 django 홈페이지나 stackoverflow를 통해서도 찾아볼 수 있으니 외적으로 배운것을 말해보자면,</p>
<h2 id="1단을-나눠야한다">1.&quot;단&quot;을 나눠야한다.</h2>
<p>프로젝트를 진행하면서 웹 서버라는 것은 단순히 템플릿을 라우팅해주고, 디비에서 정보를 끌어오는 &quot;기본적인&quot; 역할만 하도록 단순히 설계해서는 안된다는 것을 배웠다. django에서 기본적으로 model을 지원해주기는 하지만, api / middleware / view를 나눠서 모듈을 설계하고 이 모듈들이 서로 동적으로 자료를 주고받으며 복잡도를 낮추고 무엇보다 코드 재사용률을 높여서 유지보수를 편하게 해야한다는 것을 깊게 깨달은것 같다. 초기에는 view파일 한곳에다가 모든 페이지에 필요한 코드를(model에서 정보 끌어와서, 처리하고, 보여주는 일련의 과정과 더불어 로그인,로그아웃 등등 모든 것을 각각의 함수에다가 한곳에 모두 때려박았었다). 당연히 이렇게 하니까 개발 속도도 느리고, 서버에서 오류가 나도 어디에 있는지 찾기도 힘들 뿐더러 느리기까지 했다. 그래서 최대한 서버의 &quot;단&quot;을 나누고 각각의 기능별로 모듈을 나누는 과정을 거쳤고 프론트에서 그때그때 url을 통해 요청하여 처리하도록 하는 편이 응답도 빠르고, 유지보수에도 좋음을 깨달았다. 어찌보면 당연한 이야기지만 난 그 당연한 이야기를 듣지 않았었고 몸소 깨달았다. 괜히 나누라고 하는게 아님을.</p>
<h2 id="2어떻게-웹-서버가-동작하는지-관리는-어떻게-해야하는지-알게-되었다드디어-실제로-배포와-서비스를-해보았다😍">2.어떻게 &quot;웹 서버&quot;가 동작하는지, 관리는 어떻게 해야하는지 알게 되었다.(드디어 실제로 배포와 서비스를 해보았다😍)</h2>
<p>NGINX(웹서버)는 혼자서 django와 연결하고 소통하지 못한다. WSGI(web server gateway interface)라는 애가 있어야 비로소 역할을 할 수 있다. NGINX가 static file들을 전달해주고 그 안에 들어갈 동적인 내용들은 wsgi를 통해 django was가 전달해준다. 지금은 다음 프로젝트를 위해 Spring을 공부중인데, Spring의 구조는 또 다르더라. 웹 서버의 구조라는 것은 프레임워크마다 상이한것 같은데 더 많은 공부가 필요한듯하다 이부분은.
하지만 django app을 EC2서버에 올리고, Nginx와 gunicorn을 붙여 호스팅을 하며 Route53을 통해 DNS설정을 해줘 비로소 이용자들이 내가 만든 서버에 접속하는 경험은 서버의 설치부터 관리까지(Nginx의 process 및 worker수의 조정, gunicorn의 worker조정을 통한 서버 &quot;터짐&quot; 방지) 해볼 수 있게 해주었다. 특히 이번 프로젝트는 동시 접속자 수가 다수 발생해서 시작 전에 염려되는 부분이 많았지만 사고는 나지 않았으니 잘했다고 자평하는 중이다.</p>
<h2 id="3-웹-서버에서의-세션">3. 웹 서버에서의 &quot;세션&quot;</h2>
<p>세션이라는 개념을 전공수업시간에 배웠지만 실제로 웹 서버에 이걸 어떻게 넣는 건지 전혀 몰랐다. 이번 프로젝트를 통해서 동시접속자 제한 기능을 넣어야 했고, 이 기능을 구현하는 과정에서 각 유저의 세션을 저장하고, 제한시간을 설정하며 유효한 세션이 있는 사람이 로그인하면 이 세션을 삭제해 강제로 로그아웃 시키는 기능을 넣었고, 물론 내 자신이 100%코드를 작성하지는 않았지만 다른이의 코드를 보고 분석해보며 어떻게 세션을 관리하는지, 세션의 생성부터 관리 삭제를 어떻게 코드로 구현할 수 있는지 배울 수 있었다.</p>
<h2 id="4-전공수업은-괜히-배우는게-아니다">4. 전공수업은 괜히 배우는게 아니다.</h2>
<p><img src="https://images.velog.io/images/makemyway-kr/post/84c95204-5b00-4866-9987-403c463f4d59/image.png" alt="">
이번 프로젝트를 하면서 설계한 DB의 ER다이어그램중 일부이다. 위와 같이 디비를 설계하고, 기본 서버 구조와 각종 보안(비밀번호 처리 등등), 통신에 있어서 전공수업때 배운 컴퓨터네트워크 , 데이터베이스, 통신 , 정보보안 등의 과목들이 큰 도움이 됐다. 전공수업은 들을 때는 이걸 어디다가 써? 하지만 굉장히 중요한 것임을 깨닫게 되었다.</p>
<h2 id="5-개발일지는-필수다">5. 개발일지는 필수다.</h2>
<p><img src="https://images.velog.io/images/makemyway-kr/post/dfd50ff2-b0d3-44da-97ca-f1d43fa41014/image.png" alt=""></p>
<p>개발을 진행하면서, 팀원 모두가 노션을 통해서 개발일지를 남겼다. 개발일지를 남김으로써 개발 과정 중에 &quot;저번에 뭐했더라?&quot;하는 문제의 해결, 팀원간의 작업 현황 공유, 버그 리포트 , 팀원 자신의 개발 과정에 있어서 기록을 남겨 추후에 스스로의 발전을 위해 활용할 수 있었다. 개발일지 문화는 팀의 개발과 개개인의 성장에 있어 큰 도움이 되었고 앞으로도 이렇게 하려 한다.  </p>
<h1 id="개선할-점">개선할 점</h1>
<h2 id="1프론트--클라이언트와의-소통">1.프론트 , 클라이언트와의 소통</h2>
<p>이번 프로젝트를 하면서 가장 크게 느낀 것은 &#39;API문서&#39;가 왜 필요한지이다. 이번 프로젝트의 각 페이지에 필요한 데이터의 수가 많은만큼 프론트와 백 사이에 활용해야할 API의 수가 많아진건 당연했다. 하지만 각 API의 request / respond형식, 주소 등을 그때그때 알려주려면 프론트 개발자들이나 나나 모두 코드를 찾아봐야하고 번거로운일이 아닐 수 없었다. 다음 프로젝트부터는 익히본 swagger같은 툴을 이용해서 api문서를 만들고 이를 통해 공유해서 개발 과정의 소통을 원할하게 해볼까 한다.</p>
<h2 id="2-어-이게-왜-안돼">2. 어 이게 왜 안돼</h2>
<p>사이트 메인 화면에는 &quot;남은 사물함 수&quot;와 학부별 신청 날짜 및 시간이 나타난다. django template rendering을 통해서 띄워주도록 하였는데 이게 admin페이지에서 날짜를 갱신하고, 학생들이 신청을 해도 갱신되지를 않았다. (테스트 서버에서는 정상적으로 바뀌었지만). 이 버그를 해결하고 만약 rendering해주는 방식의 문제라면 django에서 동적으로 fetch가 어떻게 이루어져야하는지 알아봐야할 것 같다.</p>
<h2 id="3-클라이언트와의-소통">3. 클라이언트(?)와의 소통.</h2>
<p>사실 좋은 뜻으로 시작한 프로젝트지만, 배포 전 단계에서 너무나도 갈등이 많았다. 개발 과정에서 학생회측의 요구사항이나 이런것들을 들은 바 없어서 팀 내부에서 디자인부터 기능까지 선정하고 개발을 했었는데, 개발 완료 후 갑작스럽게 거의 갈아엎다시피(?) 해야하는 수정요구를 대뜸 배포 직전에 내놓아서, 우리 팀 모두 당황한 바 있다. <em>(심지어 돈 안받고 자원봉사 수준으로 한 프로젝트다)</em> 어쨌던 간에, 다음 프로젝트도 그렇고 프로젝트를 기획하고 개발하는 과정에서 타겟으로 생각하는 클라이언트와 인터뷰도 해보고, 의견을 수렴하고 수정하는 과정을 거칠 필요가 있어 보였다.</p>
<h2 id="4-개발-기간-관리">4. 개발 기간 관리</h2>
<p>개발하면서, 각자 일도 있고 학교도 다녀야하고 하다보니 개발 일정이 생각보다 늘어진 면이 있다. 저번 프로젝트보다는 훨~씬 짧은 기간동안 잘 해내었지만, 여전히 내 생각보다는 그렇지 않은 면이 있어서 이번 정보처리기사 시험공부를 하면서 배운 &quot;애자일 방법론&quot;과 &quot;나선형 모델&quot;등 개발 모델을 참조해서 정석적으로 개발 기간을 관리해보고 과정을 더욱 매끄럽게 해보고 싶다.</p>
<h1 id="thanks-to">Thanks to</h1>
<p>프로젝트를 함께한 수호, 중간에 갑작스럽게 함께해달라 했는데 흔쾌히 참여해준 수민이 너무 고맙다🥳 다음 프로젝트도 화이팅!!!! TEAM MAT
아 그리고 프로젝트 기간동안 멘탈케어를 해준 준식이형에게도 땡큐</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Django 사용기]]></title>
            <link>https://velog.io/@makemyway-kr/Django-%EA%B1%B8%EC%9D%8C%EB%A7%88</link>
            <guid>https://velog.io/@makemyway-kr/Django-%EA%B1%B8%EC%9D%8C%EB%A7%88</guid>
            <pubDate>Wed, 01 Dec 2021 09:13:30 GMT</pubDate>
            <description><![CDATA[<h1 id="장고를-시작한-계기">장고를 시작한 계기</h1>
<p>우리 단과대학(IT대학)에서는 매년 개인 사물함 신청을 할 때에 사용하는 웹이 있었는데, 어느 선배가 몇년전에 개발한 것을 계속해서 사용하는 중이었다. 비개발자인 학생회 집행부가 매번 서버를 가동하고 운영하기에도 어려워보였었다. 그런데 해당 웹의 파일과 서버가 소실되어서 사물함 웹을 새로 개발할 필요성이 생겼다.
그래서 이 &quot;사물함 신청&quot; 서비스를 만들기 위해서 프로젝트를 시작하게 되었다.</p>
<h2 id="왜-장고야">왜 장고야?</h2>
<p>앞서 말했듯이 비개발자인 타 과 소속의 학생회 구성원들이 운영하기가 쉬워야한다. 장고는 그런면에서 기본적으로 제공하는 관리자 페이지가 있고 여기서 신청 및 학생 데이터를 관리하라 수 있다. 두번째로, 장고는 파이썬의 프레임워크이다. 알고리즘을 해결할 때도 느꼈지만, 파이썬이라는 언어가 나에게는 편리하게 느껴졌기에(깊게 안파봐서 그런걸 수도 있겠다) 장고를 배워보고 싶었다.</p>
<h2 id="프로젝트로-공부하기">프로젝트로 공부하기</h2>
<p>NODE.JS를 공부할 때도 그랬지만, <a href="https://velog.io/@makemyway-kr/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EA%B3%B5%EB%AA%A8%EC%A0%84-%ED%9B%84%EA%B8%B0">나는 뭔가를 만들어보면서 공부하는게 효율적이라 생각한다.</a> 공식문서나 먼저 프레임워크를 공부하신 분들이 올려놓은 글들, 교재들을 보면서 공부하는 것은 같으나, 그분들이 작성해놓으신 예시 코드를 그대로 따라하는 것과 참고 및 응용하여 내 프로젝트에 맞게 적용해 보는 것은 다르다고 생각하였고 후자가 나중을 위해서는 훨씬 좋다고 생각했기 때문이다.</p>
<p>그래서 탄생한 프로젝트가 바로 이것이다 <a href="https://github.com/amuguna1mandeum/lockerweb">사물함 서버</a></p>
<h1 id="장고-첫인상">장고 첫인상</h1>
<p>장고의 첫인상은... &quot;다 갖춰져 있다&quot; 였다. startapp명령어를 하나 눌렀을 뿐인데 파이썬 파일들이 쫙쫙쫙 깔리더니 그에 맞춰서 코드를 작성하기만 하면 됐다. 물론 지금은 그 속에서도 내가 해줄 것이 많은 것을 체감한다.</p>
<h1 id="장고-걸음마-떼어가기">장고 걸음마 떼어가기</h1>
<h2 id="지금까지-해본것">지금까지 해본것</h2>
<h3 id="mysql-db연결하기">MySQL DB연결하기</h3>
<p>장고를 처음 시작하면, sqlite가 자동으로 연결되어있다. sqlite를 사용하기에는 사물함 서버가 동시에 처리해야할 데이터의 양이나 저장해야할 용량이 이에 맞지 않고 또한 내가 sqlite를 배워본적이 없어 mysql(AWS RDS)를 연결해 주었다.
<img src="https://images.velog.io/images/makemyway-kr/post/0c9ac36f-948d-463d-a5f2-b90338cdd5a4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-01%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.56.41.png" alt="database설정">
이런식으로 보안을 위해서 따로 database.py 파일을 만들어서 import한 후 값을 넣어주는 방식으로 적기만 해주면 끝!(gitignore에 database.py파일 추가는 덤) node.js로 프로젝트를 할 때에 json파일로 보안을 유지했던 것을 응용해 보았다.</p>
<h3 id="커스텀-유저모델-만들기">커스텀 유저모델 만들기</h3>
<p><a href="https://dev-yakuza.posstree.com/ko/django/custom-user-model/">https://dev-yakuza.posstree.com/ko/django/custom-user-model/</a>
이 게시글을 응용하였다.
기본적으로 django가 유저모델을 지원하기는 하나, 학생 데이터를 유저 정보에 넣어주어야 했기에 별도로 만들어 주었다.(github에 퍼블릭으로 해 두었으니 한번 봐보시기를)</p>
<h3 id="로그인-기능-만들기">로그인 기능 만들기</h3>
<p>점프 투 장고에 나와있는 auth_views.loginview를 이용하였다. 미리 만들어둔 커스텀 유저모델이 기본 유저 모델로 인식되어 로그인이 가능하다.</p>
<p>이것들이 지금까지 해본 것들이고, <a href="https://www.notion.so/amuguna1mandeum/IT-28e22b4b568543d7ade823bcc97bcead">https://www.notion.so/amuguna1mandeum/IT-28e22b4b568543d7ade823bcc97bcead</a>  notion에 개발일지를 작성하며 해가는 것들을 정리중이다.</p>
<h2 id="장고의-특징이라-쓰고-내가-느끼는-장점이라-한다">장고의 특징(이라 쓰고 내가 느끼는 장점이라 한다)</h2>
<h3 id="html에-파이썬-코드를">html에 파이썬 코드를?</h3>
<p>{% %}를 이용해서 파이썬 코드?를 템플릿에 넣어놓고 이를 render하면 실행되어 view로 나타난다. 이 것이 제일 신기했던 경험이 아닐까 느껴진다.</p>
<h3 id="모델">모델</h3>
<p>웹에서 사용할 데이터베이스 entity를 model로 작성한다. 그저 model을 작성하고 makemigrations/migrate명령어를 치면 알아서 데이터베이스에 적용해준다! 직접 쿼리를 작성하고 적용할 필요가 없는 것이 너무나도 편하고 장점으로 여겨졌으며, 데이터베이스에서 데이터를 가져오는 것 또한 model을 이용하여 query없이 간편하게 view에 표시해 줄 수 있었다.</p>
<h3 id="관리자-페이지">관리자 페이지</h3>
<p>superuser를 터미널에서 만들어주면, 해당 계정을 통해서 관리자 페이지에 접속이 가능하다(기본 생성) 앞서 말했지만 이 페이지를 통해서 웹 내의 데이터들을 간편히 관리할 수 있어서 너무 좋은듯 하다</p>
<p>하면 단점이 없는 것도 아니다.</p>
<h1 id="단점">단점</h1>
<p>너무 다 갖춰져있다.... 이게 장점이기도 하지만 마음대로 커스터마이징 하는데에 제약이 있다고 느껴졌다. 프레임워크라는 것이 기본적으로 제약이 있기는 하지만, 장고 같은 경우는 대다수 사람들이 말하는 것처럼 타 프레임워크들에 비해서도 제약이 있다.
또한 공식문서가 한국어 번역이 제대로 안되어있다. 되다 말았다. 한국어로 언어 선택을 하여도 영어로 표시되는 부분들이 꽤나 많아 어려움이 있고, 되어있는 번역 조차도 완벽하지 않다. (읽다가 한국말이지만 이게 무슨말이지?하는 부분들이 꽤나 많다) 영어를 나름 그래도 자신있어 했는데, 용어가 용어다보니 해석이 꽤나 힘들었다.</p>
<h1 id="갈무리">갈무리</h1>
<p>아직 장고를 시작한지 한달도 안되어 이 정도가 지금까지 해오고 또 느낀 점들이다. 너무 사소해서 안 쓴 이야기도 많지만, 그런 내용은 노션과 깃허브에도 정리해 두었으니 봐주시면 감사하겠다. 글 쓰는 재주가 좋지 않아 할 이야기를 제대로 정리하지 못한 듯 한데, 기술적인 부분들은 내가 참고하였듯이 많이 이미 정리 되어있기에 내가 다루지는 않고, 참고한 링크들을 프로젝트 진행 중에 올리며 &quot;이런 문제가 발생하면 요런걸 찾아보세요~&quot; 라고 올릴 예정이다. 또 프로젝트 결과물에 대한 게시글도 올릴 예정이다.
혹시 나와 같이 장고를 공부중인 분들이 계시다면, <a href="https://www.notion.so/amuguna1mandeum/IT-28e22b4b568543d7ade823bcc97bcead">노션 개발일지</a> 와 <a href="https://github.com/amuguna1mandeum/lockerweb">깃허브</a>를 자주 봐주시면 감사하겠습니다아(이 부분만 존댓말인건 안비밀)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS RDS 데이터베이스를 MySQL workbench로 관리하기]]></title>
            <link>https://velog.io/@makemyway-kr/AWS-RDS-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%A5%BC-MySQL-workbench%EB%A1%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@makemyway-kr/AWS-RDS-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%A5%BC-MySQL-workbench%EB%A1%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 22 Sep 2021 12:01:00 GMT</pubDate>
            <description><![CDATA[<p>그래커리 프로젝트를 진행하면서, 로컬 환경에서 MySQL  데이터베이스를 만들고 프로젝트 코드를 만들다보니 다른 팀원들이 테스트를 해야할 때 불편함이 있었고 또한 배포를 위해서도 클라우드 데이터베이스를 이용해야할 필요성을 느꼈었다.
그래서 선택한 것이 AWS의 RDS(MySQL community)이다.
Azure의 MySQL Database서비스도 있지만, 기본적으로 사용하기에 불편함도 있고, 자료도 충분하지 않아서 AWS RDS를 선택하였다.
본론으로 돌아가서, RDS 데이터베이스를 생성하는 작업에 대해서는 이미 많은 자료들이 존재하니 다루지는 않겠다. 다만 데이터베이스를 생성하는 과정에서, Workbench를 사용하기위해서는 <img src="https://images.velog.io/images/makemyway-kr/post/118aaa94-c826-4b62-9b18-12f9470ea31e/image.png" alt="">
에서 퍼블릭 액세스 <strong>가능</strong>에 <strong>꼭꼭 체크를 해주어야 됐다.</strong>
굳이 public access를 하지 않을 것이라서 불가능으로 체크했더니, Workbench접속이 되지 않았다.
데이터베이스를 생성해주는 과정에서 MySQL community를 선택해주고 데이터베이스를 생성하면 <img src="https://images.velog.io/images/makemyway-kr/post/64dfc698-0f8e-4da4-b88e-098804df0bd5/image.png" alt="">과 같이 데이터베이스가 생성된다. 
아래의 &quot;구성&quot; 메뉴를 누르면 밑에
<img src="https://images.velog.io/images/makemyway-kr/post/92aaab16-6122-490d-ba0e-a1f5101cc445/image.png" alt="">
다음과 같이 설정해둔 마스터 사용자 이름을 확인할 수 있다.(워크벤치 연결, 데이터베이스 연결 시 필요)</p>
<p><a href="https://dev.mysql.com/">https://dev.mysql.com/</a>에서 MySQL community version과 Workbench(대게는 같이 깔림) 을 다운받고, Workbench에 들어가서
<img src="https://images.velog.io/images/makemyway-kr/post/3f177b4a-61aa-4855-a303-da0936171555/image.png" alt=""> 여기서 +버튼을 누르면 데이터베이스 연결을 추가할 수 있다.
해당 버튼을 누른 뒤,
<img src="https://images.velog.io/images/makemyway-kr/post/f4fd26fa-bb4d-4997-990a-86f154d9d110/image.png" alt=""></p>
<p>이름은 원하는 것으로 짓고, Hostname에는 위의 AWS 데이터베이스 정보 상의  연결&amp;보안에 있는 DB의 엔드포인트 주소를 넣고, 포트번호는 설정한 포트를(기본값 3306) , Username에는 위의 마스터 사용자 이름을 입력한다. 그 뒤 데이터베이스 생성과정에서 설정한 비밀번호를 입력하고 store in vault를 체크해준뒤(체크해줘야 나중에 또 물어보지 않는다) test connection 버튼을 눌러 연결이 잘 되는지 확인한다.</p>
<p>Test connection에 성공했다하면, 창을 닫은 뒤 DB 커넥션 버튼을 눌러 디비를 관리할 수 있다.
<img src="https://images.velog.io/images/makemyway-kr/post/25671d9b-948e-419e-9049-8e68837bd0a7/image.png" alt="">
왼쪽에 이러한 바가 보일텐데, users and Privileges에 들어가면 마스터 사용자 외의 유저를 생성하여서 권한을 달리할 수 있고(마스터 계정을 웹 앱과 DB간의 커넥션에 사용하기에는 위험하므로 전용 계정(유저)를 따로 만들어두는 등), Data Export/Import를 사용하여 기존의 DB에서 정보를 옮겨오거나 옮길때 사용할 수 있다.</p>
<p><img src="https://images.velog.io/images/makemyway-kr/post/0fbd9116-a3b9-4eeb-befa-b5669bfea702/image.png" alt="">
Schemas를 누르면 DB에 존재하는 스키마들의 목록이 뜨며, 각 스키마 위에 마우스를 올리면 스키마의 정보를 조회하거나 스패너 버튼을 눌러 스키마를 수정할 수 있다.
또 왼쪽의 화살표 버튼을 누르면 메뉴가 펼쳐지면서 스키마의 테이블들을 볼 수 있고 마찬가지로 테이블의 컬럼을 수정하거나 하는 등의 작업을 수행 할 수 있다.</p>
<p>콘솔로 DB를 관리하는 것도 단순하다는 장점이 있지만, WORKBENCH의 GUI를 이용해서 명령어를 일일이 칠 필요없이 schema와 table들을 편리하게 관리할 수 있는 것이 큰 장점이라 생각한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Visual Code를 이용해서 EC2에서 작업하기!]]></title>
            <link>https://velog.io/@makemyway-kr/Visual-Code%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-EC2%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@makemyway-kr/Visual-Code%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-EC2%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 22 Sep 2021 11:00:18 GMT</pubDate>
            <description><![CDATA[<p>오늘은 저번에 만든 프로젝트 <a href="https://velog.io/@makemyway-kr/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EA%B3%B5%EB%AA%A8%EC%A0%84-%ED%9B%84%EA%B8%B0">(링크)</a>를 EC2에서 작업 및 배포 하기 위해서 EC2 를 어떻게 사용해야할지 공부해보았다!</p>
<p>당장에 익숙한 툴을 이용해서 EC2를 사용할 수 있는 방법이 없을까? 찾던 중
visual studio code에  간단한 extension을 추가해서 마치 내 데스크톱처럼 사용할 수 있는 방법을 찾을 수 있었다.
<img src="https://images.velog.io/images/makemyway-kr/post/851c01b5-20f8-48c3-a4c0-b04ef0c809dd/image.png" alt="">
바로바로...FTP-SIMPLE이라는 녀석이다.
이녀석을 visual studio code에 설치하고, 명령 팔레트에 들어가 ftp-simple config를 찾아준다.
<img src="https://images.velog.io/images/makemyway-kr/post/1d0351bb-81d3-4e2c-98c4-fde3ce7f6877/tempsnip.png" alt="">
name은 아무렇게나 해주고, host에는 EC2인스턴스의 ip주소를, port는 22, username은 ec2에 ssh접속을 할 때에 @앞에 붙여주는 이름을(대게 ubuntu), path는 EC2인스턴스 내에서 사용하는 디렉토리 위치를 설정해 주면 되고, privatekey는 EC2인스턴스를 생성할때 받은 pem파일의 위치를 넣어주면된다.
이렇게 설정해준 뒤, <img src="https://images.velog.io/images/makemyway-kr/post/93b9cfe6-8cbc-4904-8674-c9a1871fb50a/ftp-simple-temp.json%20-%20ubuntu%20-%20Visual%20Studio%20Code%202021-09-22%20%EC%98%A4%ED%9B%84%207_56_11%20(2).png" alt="">
명령 팔레트에서 위의 버튼을 누르고 설정한 name의 remote와 directory버튼을 다시 눌러 들어가주게되면, 데스크톱에서 visual code를 사용할때와 같은 화면이 나오고, 
<img src="https://images.velog.io/images/makemyway-kr/post/d31c0ae4-37fc-43f5-b888-82e33d1142da/image.png" alt="">
(위의 파일들은 내가 새로 만든것) 폴더를 만들고, 파일을 만들어 코딩한 파일들을 옮겨와(복붙하거나, git clone을 이용) 
배포하거나 터미널을 열어 각종 모듈들을 다운 받을 수 있다!(평상시에 로컬환경에서 사용하던 것과 같이)</p>
<p>끝!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[소프트웨어공모전 후기]]></title>
            <link>https://velog.io/@makemyway-kr/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EA%B3%B5%EB%AA%A8%EC%A0%84-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@makemyway-kr/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EA%B3%B5%EB%AA%A8%EC%A0%84-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 19 Sep 2021 09:04:44 GMT</pubDate>
            <description><![CDATA[<p>학교 학부에서 주최하는 소프트웨어 공모전에 지난 6개월간(학기 중에는 작업을 못하다 싶이 했으니...사실상 3개월..?)작업한 GRACURRI를 출품했다.
<a href="https://github.com/gracurri">그래커리 깃허브</a>
대회의 후기와 만든 작품에 대한 설명을 이렇게 velog에 써보고, 아쉬웠던 점과 보완해야 할 점을 남기고싶었다.</p>
<h1 id="그래커리">그래커리?</h1>
<p>그래커리를 처음 기획한건 2021년 초 겨울방학 중이었다.
다가올 1학기를 앞두고 수강신청을 위해서 시간표를 짜고 있는데, 순간 이 과정이 너무 반복적이고 귀찮다는 생각이 들었다. 매번 수강신청 때마다 유세인트 졸업사정표를 찾아보고, 남은 이수 학점은 몇점이며 전공은 몇학점, 교양은 몇학점 들어야할지 정하고 또 학기에 개설된 과목들을 확인해서 시간표에 집어넣는 이 과정이 너무 귀찮았다. 
그래서 생각한게, </p>
<blockquote>
<p>이 모든 과정을 대신해줄 프로그램을 만들면 안되나?</p>
</blockquote>
<p>였다.
그래서 생각해낸 웹 프로그램은, <strong>1)이제까지 들은 과목들과 자신의 학번, 학년을 집어넣으면, 들은 과목들의 이수영역과 학점단위수를 분석하여 졸업요건과 비교하고, 2)남은 졸업 요건(교양 이수 영역, 학점)에 맞추어 남은 학기들의 이수 계획을 세워주며(각 학기마다 들을 과목들의 리스트를 만들어준다), 3) 매 학기 수강신청 전에 유세인트에 공지되는 과목 시간표를 참고하여 해당 학기 시간표를 분반까지 고려하여 짜준다.</strong> 라는 프로세스의 웹 프로그램이었다.
이걸 프로젝트로 진행해보자 하였고, 팀장으로서 팀원을 모집하여 팀을 꾸려 팀 프로젝트로 진행해보았다.
<strong>나조차도 웹을 처음 해보는 것이기 때문에, 프로젝트는 모든 팀원이 웹 공부를 하면서 실습해본다는 생각으로 진행하고자 하였다.</strong></p>
<h2 id="시스템-구성">시스템 구성</h2>
<p>시스템 구성은 간단했다. 사용자가 사용할 웹 페이지의 html문서를 만들고, 프론트에서 입력받은 정보, 또는 요청한 url을 핸들링할 router를 만들었으며 회원의 정보들(학번,들은 과목들, 들을 과목들)을 담을 DB를 구축하면 됐다.
<img src="https://images.velog.io/images/makemyway-kr/post/e520877c-beff-4e61-a1b9-aa21a6e058eb/KakaoTalk_20210910_042947620_04.png" alt=""></p>
<h2 id="앱-구성">앱 구성</h2>
<p>앱은 회원가입, 과목 서칭 및 입력, 이수 계획확인, 시간표 확인의 페이지로 구성하였다.</p>
<p><img src="https://images.velog.io/images/makemyway-kr/post/2ae8f0c6-5bef-45e9-b6e2-f78606e95fc7/KakaoTalk_20210910_042947620_06.png" alt=""></p>
<h2 id="사용-언어프레임워크클라우드">사용 언어,프레임워크,클라우드</h2>
<p>처음으로 웹 페이지를 제대로 만들어 보는 거라, javascript도 연습해 볼겸 node.js(express)를 사용했다. html문서를 따로 만들고, static을 이용했다.
AWS RDS를 이용해서 데이터베이스를 구축하는데에 성공했다. MySQL을 사용했고, Workbench를 이용하니 확실히 편하게 DB를 관리할 수 있었다.
AWS EC2를 사용해서 웹 배포를 하려고 했는데, 대회 기간 내에 배포방법을 모두 공부하지는 못하여 아쉬웠다.</p>
<h2 id="결과">결과</h2>
<p>참가한 24팀중 15팀에 들어 1차를 통과하고 2차 심사에 올라갔다.
회원가입, 수강한 과목 입력, 계획 DB에 들어있는 데이터를 프론트로 보내 수강할 과목의 리스트를 띄워주고, 시간표를 시각적으로 보여주는 것에는 성공하였다. 하지만 제출 당일 까지 알고리즘을 수정해보았음에도 불구하고 들은 과목들을 바탕으로 계획을 생성하는 프로세스를 완성하는데에 실패하였고, 결국에는 수상을 하지 못하였다.</p>
<h2 id="배운-것">배운 것</h2>
<ul>
<li><p>HTML문서는 어떻게 만드는 것이고, css로 어떻게 꾸미는지, javascript로 어떻게 버튼에 동작을 집어넣는지를 처음으로 배워보았다. </p>
</li>
<li><p>서버는 어떻게 구축하는 것이며 Node.js를 이용해서 routing은 어떻게 하는지(이과정에서 express프레임워크 또한 배울 수 있었다)의 서버 사이드도 배우는 계기가 되었다. </p>
</li>
<li><p>데이터베이스 구축을 위해서 MySQL을 배우고, workbench는 어떻게 사용하는 것이며 데이터베이스,테이블은 어떻게 만들고 각종 쿼리들(INSERT, DELETE, UPDATE 등등)은 어떻게 사용하는지에 대해서도 알게 되었다.</p>
</li>
<li><p>AWS CONSOLE의 사용법, EC2 인스턴스와 RDS데이터베이스는 어떻게 생성하고 접속 및 사용할 수 있는지에 대해서 알게 되었다.</p>
</li>
<li><p>무엇보다도, 프로젝트를 이끄는 팀장으로서 프로젝트 기획,기획서 작성 팀의 개발 계획을 수립하고 이를 이행하는 과정에서 팀장의 동기부여의 필요성과 업무 조정 방법, Notion사용법, 팀 작업에서의 github사용법에 대해서도 배우는 계기가 되었다.</p>
</li>
</ul>
<h2 id="프로젝트-진행과정에서-힘들었던-점">프로젝트 진행과정에서 힘들었던 점</h2>
<p>회원별로 이전 페이지에서 입력한 수강한 과목 리스트를 DB에 조회하고 이 과목 리스트를 바탕으로 수강 계획을 짜야하는데, 비동기적인  javascript가 계속하여 db.query함수를 늦게 실행하도록 하여 오류가 발생하였다. 들은 과목 리스트를 조회하고 값들을 배열에 push해둔 뒤 프로세스를 진행해야하는데, 이 부분부터도 실행되지 않아 콜백, Promise, setTimeout을 써보기도 하였지만 되지 않았다.
아무래도 node.js와 자바스크립트에 대한 이해가 불충분하여 제대로 활용하지 못한 탓 도 있겠지만, 여러번 DB와의 통신이 이루어져야 하는 우리의 프로그램에 사용하기에는 적절하지 않았던 것도 같다. 
또 팀장으로서 팀의 개발 프로세스를 모두 책임져야 하는 동시에 백엔드를 <strong>혼자</strong> 구축해야해서 핑계같지만 백엔드 개발 프로세스가 늦어진점도 아쉬웠다.(나머지 팀원들은 모두 프론트를 담당했고, 한 분은 DB를 담당해주셨다)
사실  팀 프로젝트의 기간이 긴(6개월정도)상황에서 팀원들을 지속적으로 동기부여하는 것도 힘들었다. 웹 공부를 위해 한다는 동기부여 외에도 직접적으로 와닿을 동기부여의 수단이 필요하였고, 나는 소프트웨어 공모전을 그 동기부여의 수단으로 삼았다. 매년 있는 대회이고 졸업요건과 상금이 걸려있기에 동기부여 수단으로 충분했다고 생각됐지만 개발 속도가 내 생각보다 느려서(다들 처음 웹 개발을 배워나가는 것이기는 하였지만) 걱정이 많이 되었었다.</p>
<h2 id="개선할-점앞으로-gracurri는">개선할 점,앞으로 gracurri는?</h2>
<p>이번 학기에 짬이 나는 대로 서버를 내게 익숙한 python으로 다시 구축해 보려한다. 최소한 javascript처럼 익숙하지 않아서 문제가 발생할 일은 없을 것 같다.
또 겨울방학 수강신청 전에 이것을 팀원들과 완성하여서 배포하고 서비스하는 과정까지 진행해 보려한다. 배포하고 서비스하는 과정에서 생기는 문제들을 핸들링해보는 경험을 해보고 싶다.</p>
<h2 id="느낀점">느낀점</h2>
<ul>
<li><p>프로젝트를 팀장으로서 이끄는 것에는 생각보다 많은 책임감과 능력이 요구되었다. 기획 단계에서 부터 기획서는 어떻게 쓰는 것이며 프론트와 백엔드의 업무는 어떻게 조율해야 하는 것인지, 프로그램을 기한에 맞추려면 개발 프로세스를 어떻게, 언제까지 진행해야하는 것인지를 생각해야했다.</p>
</li>
<li><p>다음 프로젝트를 할 때에는 사전에 개발 프로세스를 좀 더 세심하게 계획하여(주먹구구식으로 개발 계획을 짠 면이 있다... 보이는 페이지부터 그냥 이거하고 이거 하고,,,,이런식으로) 팀의 역량이 분산되지 않고, 기한에도 맞출 수 있도록 해야겠다.</p>
</li>
<li><p>백엔드 개발자로서는,,, 생각보다 프론트와 백엔드의 합이 중요하다는 것을 느꼈다. API 하나를 만들더라도 프론트와 json데이터 이름은 무엇으로 주고받을 것인지, url은 어떻게 할 것인지를 소통해야했고 프로세스도 맞춰 나가야했다. (프론트는 1 작업하고있는데 나는 1은 나중에하고 2 먼저해야겠다 하다가 엇갈리는 경우도 있었다). 다음 프로젝트에서는 API설명 문서를 하나 만들어서 프론트 분들이 좀 더 쉽게 데이터 송수신 함수를 구성할 수 있도록 하고, 프로세스도 맞춰나갈 수 있도록 해야겠다 싶었다.</p>
</li>
<li><p>그리고 내가 Node.js를 사용한다 하였을때, 주변에서 node.js는 불안한데,,,,? 하는 말을 많이들었다. 실제로 사용해보니 비동기적 처리도 그렇고, 오류나면 서버 전체가 다운되거나 꼬이는 문제가 발생해버려서 많이 불편함을 느겼다.</p>
</li>
<li><p>데이터베이스를 구축하면서, 생각보다 이 작업이 재밌다는 것을 느끼게 되었다. 마침 2학기에 데이터베이스 과목을 듣는데 프로젝트를 하면서 이론적 지식없이 MySQL코드와 내 감에 의존하여 데이터베이스를 구축했던 점이 있어서 수업때 배우는 데이터베이스 이론 지식을 바탕으로 재구성 해보고, SQL자격검정 시험도 준비해보려한다. (데이터베이스의 키에 super key, candidate key등의 구분이 있는 것도 몰랐다). 좀더 효율적이고 쉬운 데이터베이스를 구축하고, 정보를 바탕으로 통계를 내보는 작업도 재밌을 것 같다.</p>
</li>
</ul>
<h2 id="갈무리">갈무리</h2>
<p>인생 첫 프로젝트...아쉬운점도 많고 배운점도 많았다. 다음 프로젝트는 좀 더 보완해서 더 나은 프로젝트로 만들고,더 나은 개발자가 되고 싶다.
수고한 팀원 모두 고맙다!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준  문제 해결 시 이용할 파이썬 입력 코드!]]></title>
            <link>https://velog.io/@makemyway-kr/%EB%B0%B1%EC%A4%80-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EC%8B%9C-%EC%9D%B4%EC%9A%A9%ED%95%A0-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@makemyway-kr/%EB%B0%B1%EC%A4%80-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EC%8B%9C-%EC%9D%B4%EC%9A%A9%ED%95%A0-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%BD%94%EB%93%9C</guid>
            <pubDate>Wed, 11 Aug 2021 11:48:15 GMT</pubDate>
            <description><![CDATA[<p>거진 2년만에 백준에서 문제를 풀었다.
문제 해결과정보다는, 백준의 코드 제출 및 채점방식에 애를 먹었다.
백준에서는 input값이 사용자 입력으로 주어지고, 출력 또한 print해주는 방식으로 해야한다.
반면 프로그래머스에서는 주어진 함수로 input값이 매개변수로 입력되며, return해주는 방식으로 결과값을 전달한다.
특히 최근 해결한 RGB거리 문제는, 입력값이 줄로 함께 주어지는데, 이를 한줄입력 받을 함수를
별도로 만들어두어 추후에 사용하고자 하였다!</p>
<pre><code>def arrayinput():
    n=int(input())
    costs=[]
    costs.append(n)
    for r in range(n):
        temp=list(map(int,input().split()))
        costs.append(temp)
    return costs</code></pre><p>먼저 가장 앞에 주어지는 행 수를 받고, 각 행을 input으로 받는데, 문자열의 형태로 받게 되므로 split()해준 뒤, list의 형태로 map해주었다. (첫번째 줄 행 수를 받을 때에도 문자의 형태로 받아지므로 int로 바꾸어 주어야한다) 그리고 이걸 가장 첫줄과 함께 list에 넣어주면... 끝!
이 코드를 사용하면 [행 수 ,[1행],[2행].....]의 형태로 나오게 된다!</p>
<p>여담</p>
<p>최근에 해결한 RGB거리 문제에 대한 내 해결법은
<a href="https://github.com/makemyway-kr/cote/tree/master/BOJ/python/RGBstreet">rgb거리 문제 해결 깃허브</a>에 있다! readme를 이용해 내 해결법과 문제 해결과정에서 겪은 어려운 점, 고민한 점들을 설명해 두었다.(프로그래머스 문제를 풀 때 부터 늘 해왔지만...)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js/express] static 파일 호스팅하기!]]></title>
            <link>https://velog.io/@makemyway-kr/Node.jsexpress-static-%ED%8C%8C%EC%9D%BC-%ED%98%B8%EC%8A%A4%ED%8C%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@makemyway-kr/Node.jsexpress-static-%ED%8C%8C%EC%9D%BC-%ED%98%B8%EC%8A%A4%ED%8C%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 09 Aug 2021 14:05:52 GMT</pubDate>
            <description><![CDATA[<p>웹 프로젝트를 진행하던 중, html과 css , javascript를 이용해서 웹 호스팅을 하고자 하였다!
node.js를 이용해서 서버를 구축 중인데, 수강중이던 강의에서는 templete을 이용해 html 문서 내용을 구성하였어서 이미 만들어 놓은 웹 문서를 어떻게 호스팅 하는지 찾아보고 공유해보려 한다!</p>
<p>Node.js의 프레임워크인 express를 이용하여 구축 중인데, express의 기본 제공 미들웨어인 express.static을 이용하면 가능했다!</p>
<pre><code>app.use(express.static(&#39;디렉토리 이름&#39;))
app.get(&#39;/&#39;, function(req, res) {
    res.sendFile(__dirname + &quot;호스팅 하고자 하는 파일의 위치&quot;)
})</code></pre><p>기본 path(&#39;/&#39;)에 대해서 get 요청이 들어왔을때 이를 처리하는 코드이다!
&#39;/&#39;위치로 웹 문서 요청이 들어왔을때, express app이 대상 디렉토리를 사용하여 static file을 전송할 수 있도록 하고, response로 해당 위치에 있는 특정 파일을 sendFile해주도록 해주었다!
하지만 밑의 res.sendFile(__dirname + &quot;호스팅 하고자 하는 파일의 위치&quot;) 코드 같은 경우에는, <strong>들어오는 요청이 app.use(express.static())으로 선언해준 위치의 파일 명과 일치하지 않기에</strong>,(예를 들어 &#39;/&#39;로 요청이 들어오면 main.html을 보내어 주어야할 때) 특정 파일을 send해주도록 한 것이고, 만약 request가 <strong>&quot;127.0.0.1:3000/main.html&quot;</strong>과 같이 app.use로 선언해둔 디렉토리 내의 특정 파일을 request했다면, res.sendFile을 해주지 않아도 호스팅이 된다!(직접 구축한 서버로 시험해본 결과)</p>
<p>다음 포스팅은 Node.js를 이용해서 SQL DB에 접근하고, 이를 이용해 서비스를 제공하는 방법에 대해서 올려보려한다!</p>
<p><a href="https://expressjs.com/ko/guide/using-middleware.html">Express 공식 사이트 미들웨어 설명 페이지</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 합승택시요금 문제 in python]]></title>
            <link>https://velog.io/@makemyway-kr/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%95%A9%EC%8A%B9%ED%83%9D%EC%8B%9C%EC%9A%94%EA%B8%88-%EB%AC%B8%EC%A0%9C-in-python</link>
            <guid>https://velog.io/@makemyway-kr/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%95%A9%EC%8A%B9%ED%83%9D%EC%8B%9C%EC%9A%94%EA%B8%88-%EB%AC%B8%EC%A0%9C-in-python</guid>
            <pubDate>Mon, 19 Apr 2021 10:21:02 GMT</pubDate>
            <description><![CDATA[<h4 id="프로그래머스-합승택시요금-문제">프로그래머스 합승택시요금 문제</h4>
<p>사용 알고리즘: 다익스트라 알고리즘
다익스트라 알고리즘을 사용하여 각 노드까지 합승할떄까지의 요금과, 택시에서 내려 각자의 집까지 갈 떄의 최저비용(최단거리)를 합해가며 비교해주는 문제이다.
문제 명세 참고:<a href="https://programmers.co.kr/learn/courses/30/lessons/72413">https://programmers.co.kr/learn/courses/30/lessons/72413</a>
틀렸던 부분: 입력 요금이 100000까지 입력된다하여 max값을 100001로 두고 비교하도록 하였는데, 다시 생각해보니 여러 요금들이 더해질텐데(ex 100000+99000등등)
이럴 경우 max값보다 커서 100001이 리턴되게된다. max를 여유있게 주었어야했다.
입력받은 fares리스트를 가지고 graph 2차원배열을 만들어서 활용하였고, 각 지점까지 dijkstra알고리즘을 돌린 값(최저비용)과 해당 지점에서 각자의 집까지의 dijsktra값을 더해가며 최저비용을 구했다.
그런데 메인 그래프에서 연결되지않은 노드(길이 없는 곳)이 있을 수 있으므로 이를 예외처리 해주기 위하여 minnode에서 방문하지 않은 최단거리 노드가 존재하지 않을경우 ans값이 그대로 0으로 나오는점을 이용하여 예외처리 해주었다.(이 경우, 연결된 모든 길을 검색했음에도 목적지까지의 경로를 구해내지 못하였으므로 최단거리가 존재하지않는, 도달할 수 없는 경로로 취급하여 답을 구하는 과정에서 제외)</p>
<p>**
새로 배운 내용! 파이썬에서 배열을 동적 할당해줄때에는
아래와 같이 [[n(임의의 수) for i in range(column크기)]for k in range(row)]]이런 식으로 선언 해 주면 된다!**</p>
<pre><code>graph=[[]]
 #사전 graph 작업
def pre(n,fares):      
    global graph
    graph=[[100000001 for col in range(n+1)]for i in range(n+1)]
    for i in range(n+1):
        for k in range(n+1):
            if i==k:
                graph[i][k]=0
            elif i==0 or k==0:
                graph[i][k]=0
    for i in fares:
        graph[i[0]][i[1]]=i[2]
        graph[i[1]][i[0]]=i[2]
#가장 비용이 적은 노드 찾는 함수
def minnode(v,f):#방문하지 않은 노드들 중 최단거리의 노드를 구함
    ans=0
    min=100000001
    for i in range(1,len(v)):
        if f[i]&lt;min and v[i]==False:
            min=f[i]
            ans=i
    if ans==0:#연결할수 있는 최단거리 노드가 존재하지 않는 경우
        return -1
    else:
        return ans


def dijk(start,fin,n):#다익스트라알고리즘
    if start==fin:
        return 0
    else:
        global graph
        flist=[0 for i in range(n+1)]
        visit=[False for i in range(n+1)]
        for i in range(1,(n+1)):
            if i==start:
                flist[i]=(100000001)
                visit[i]=(True)
            elif graph[start][i]!=100000001:
                flist[i]=(graph[start][i])
            else:
                flist[i]=100000001
        rc=True
        while visit[fin]!=True:
            curr=minnode(visit,flist)
            if curr==-1:
                rc=False
                break
            else:
                visit[curr]=True
                for i in range(1,n+1):
                    if flist[curr]+graph[curr][i]&lt;flist[i] and visit[i]==False:
                        flist[i]=flist[curr]+graph[curr][i]
        if rc==False:
            return 100000001
        elif rc==True:
            return flist[fin]
def solution(n, s, a, b, fares):
    answer = 100000001
    if len(fares)==3:
        answer=fares[0][2]+fares[1][2]+fares[2][1]
    else:
        pre(n,fares)
        for i in range(1,n+1):
            answer=min(answer,dijk(s,i,n)+dijk(i,a,n)+dijk(i,b,n))
    return answer</code></pre>]]></description>
        </item>
    </channel>
</rss>