Inversion of Control(IoC) : 제어의 역전

• 프로그램의 제어 흐름을 직접 제어하는 것이 아니라, 외부에서 관리하는 것

 객체의 생성과 소멸, 그리고 객체간의 의존관계를 설정하는 행위

    -  모두 프레임워크가 대신 해준다 : 주도권이 역전됨 → 제어의 역전

    -  프레임워크가 흐름을 주도하면서 개발자가 만든 어플리케이션 코드를 사용한다.

 이렇게 IoC가 일어나는 공간을 IoC 컨테이너라고 부른다.

 

도대체 무슨 말이야

 분명 코드를 작성한건 나인데, 왜 자꾸 주도권이 프레임워크에 있다는 거지? 🤔

 → 이를 이해하기 위해, 프레임워크를 사용할때와 사용하지 않을 때를 비교해보자

 

1 )  직접 객체를 생성하고 의존관계를 설정해주는 경우

public class BeanKor {
    public void sayBean(String name){ System.out.println("한국 콩!"); }
}

public class BeanEng {
    public void sayBean(String name){ System.out.println("English Bean!"); }
}
public class YummyBean {
    public static void main(String[] ars){
        BeanKor bean = new BeanKor(); // 한국 콩!
        // BeanEng bean = new BeanEng(); // English Bean!
        bean.sayBean();
    }
}

• main에서 BeanEng를 BeanKor로 바꿔줘야 함 : YummyBean은 BeanEng/Kor에 의존성을 가지고 있다

    -  YummyBean의 기능을 바꾸고자 할 때, BeanEng/Kor도 함께 바꿔줘야 하기 때문이다.

    -  이러한 번거로움을 해결해주기 위해서는 객체의 인스턴스를 외부에서 생성받을 필요가 있다. (의존성 주입)

2 )  의존관계를 외부로부터 받아오는 경우 (의존성 주입)

public interface Bean { public void sayBean(); }

public class BeanKor implements Bean{
    public void sayBean(){ System.out.println("한국 콩!"); }
}

public class BeanEng implements Bean{
    public void sayBean(){System.out.println("English Bean!");}
}
public class YummyBean {
    public static void main(String[] ars){
        Bean bean = new BeanKor(); // 한국 콩!
        // Bean bean = new BeanEng(); // English Bean!
        bean.sayBean();
    }
}

• 하지만 여전히 출력되는 값을 바꾸기 위해선 소스코드의 수정이 필요하다.

 더 개선시킬 수 있을까?

3 )  프레임워크가 대신 객체를 생성하고 의존관계를 설정해주는 경우 (IoC)

public interface Bean { public void sayBean(); }

public class BeanKor implements Bean{
    public void sayBean(){ System.out.println("한국 콩!"); }
}

public class BeanEng implements Bean{
    public void sayBean(){ System.out.println("English Bean!"); }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation=".../beans/spring-beans.xsd">

		<bean id="Bean" class="BeanKor"/>
		<!--<bean id="Bean" class="BeanEng"/>-->
</beans>
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class YummyBean {
    public static void main(String[] ars){
        BeanFactory factory = new XmlBeanFactory
                             (new FileSystemResource("resources/beans.xml"));

        Bean bean = factory.getBean("bean", Bean.class);
        bean.sayBean(); // 한국 콩!
    }
}

• 소스 코드의 변경 없이 환경설정만으로도 프로그램을 제어할 수 있다

• 이것이 가능한 이유는, 객체의 생성과 주입을 모두 스프링 프레임워크가 주도하고 있기 때문 (IoC)

    -  프로그래머는 BeanKor 클래스와 BeanEng클래스를 정의하기만 했다.

    -  기존 코드에서처럼 bean에 BeanKor를 넣어줄지, BeanEng를 넣어줄지 결정하지도 않았고,
        new BeanKor( ) 따위의 생성자로 객체를 생성하지도 않았다.

    -  스프링이 스스로 설정 파일을 읽고, 거기 써져 있는대로 객체를 생성한 다음 반환해줬다 : '주도권' 을 가짐

프레임워크가 생산성을 높여주는 이유

• 프레임워크는 뼈대를 제공하고, 그 위에 개발자가 코드를 올려 동작하게끔 한다.

• 개발자 입장에선 로직에 더 집중할 수 있고, 객체지향 개발에 있어서 시스템을 일관성있게 관리할 수 있다.

• 여러 개발자들이 각자의 취향에 따라 설계하고 코딩한다면 관리가 어렵지만, 프레임워크가 제공하는 뼈대와 가이드에 따라 개발하면
    시스템의 유지/보수가 용이하다.

• 예) 기존에 쓰던 객체를 버리고, 새로운 객체를 사용해야 하는 경우

    -  [상황] 5000원 할인권만 뿌리고 있었는데, 50% 할인권을 뿌려야 한다고요?

        ◦ (1)의 방법 : 새 클래스 정의하고, 코드 일일이 돌면서, ctrl+f 해가면서, 일일이 수정 작업 ㅠ

        ◦ (3)의 방법 : 새 클래스를 정의한 다음, 설정 파일만 수정해주면 끝!

 

참고자료

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

IOC와 DI 에 대하여 (스프링 개념 이해하기 쉽게 설명)

Inversion of Control (제어의 역전) DI(의존성 주입)을 이해하기 위해서는 IoC(제어의 역전) 의 개념을 알고 넘어가야 할 필요가 있다. 스프링을 쓰기 전에는 개발자가 프로그램의 흐름(애플리케이션

mo-world.tistory.com

 

 

 
(서류 합격 후기(https://agentsmith.tistory.com/10)에 이어지는 멋쟁이사자처럼 9기 면접 합격 후기입니다  'ᴗ' )

 

면접 준비는 인터넷으로 멋사 면접 후기를 찾아보면서 나올 법한 기본적인 질문들을 정리했고,

내 지원서를 여러 번 읽어보며 예상 질문을 뽑아보는 식으로 대비했다.

다양한 질문들을 정리한 다음 가볍게 여러번 읽어보면서 답변하는 연습을 하면 어렵지 않게 준비할 수 있을 것 같다.

 

아래는 내가 서치하면서 카테고리별로 정리해본 예전 기수의 면접 질문이다.

지원서에서 나오는 개별 질문 이외의 공통질문은 거의 이 안에서 나오는 것 같았다.

 

CS 지식 관련 기술 질문을 하는 대학도 있다고 본 것 같은데, 나는 다행히 기술 질문은 나오지 않았다.


지원동기

간단한 자기소개

 

- 멋사가 하고싶은 이유

- 멋사는 무엇을 하는 동아리인가?

- 다른 동아리와 다른 멋사만의 장점이나 매력

- 왜 굳이 학원이 아닌 멋사에서 웹개발을 공부하고 싶은가?

- 멋사에서 무엇을 얻어가고 싶은가?

 

나의 장단점

- 어려움을 극복하는 방법

- 본인을 뽑아야 하는 이유

- 코딩 할 때 추구하는 가치

지원서로 제출한 '만들고 싶은 서비스'에 대한 간단한 설명

열정을 가지고 일했던 경험

마지막으로 하고싶은 말

 

- 갈등 조절 방법

- 팀 프로젝트 경험

- 협업을 할 때 중시하는 가치

- 팀장과 팀원중 어느 것을 선호하는가?

- 팀원들과 생각이 다를 때 어떻게 할 것인가?

- 팀장의 입장에서 팀원이 잘 따라오지 못한다면 어떻게 할 것인가?

내 아이디어를 관둬야 하는 상황이 온다면 어떻게 할 것인가?


면접은 20분 가량 온라인으로 진행되었으며, 2인 1조로 면접자 조가 구성되었다.

2인 1조 면접인데 20분간 진행되는 거니까 정작 내가 답변하는 시간은 10분 정도인 것으로 생각하면 된다.

줌 대기실에서 같은 조 면접자분과 함께 기다리다가 시간이 되니 면접실로 이동했다.

 

면접관은 7명 정도 계셨던 것 같고, 질문은 동아리 회장님만, 나머지 분들은 듣고 평가만 하는 식으로 진행되었다.

질문 답변 시간을 각 질문마다 안내해 주셔서 정해진 시간 안에 답변해야 했다.

이게 은근 시간이 쫄리는데 중간에 시간이 모자라서 다 대답하지 못한 질문도 있었다ㅠ

 

그래서 나는 어떤 질문이 면접에 나왔냐 하면...

 

기억이 안난다...!
큰일이다! 면접 본지 1년이 지나서 가물가물하다. 그래도 최대한 기억나는대로 정리해 보겠다!

일단 위의 질문 리스트에서 주황색으로 표시한 것이 나왔던 걸로 기억한다.


지원동기

: 지원서에 쓴 내용을 바탕으로 이야기함!
웹개발에 흥미를 가지게 된 이유와 웹개발 지식이 필요한 상황 등을 언급하며 멋사에서 활동하고 싶은 이유를 설명했다.

 

간단한 자기소개

: 학과랑 컴퓨터공학과 복수전공 하고 있다고 이야기하고, 어떤 종류의 개발을 좋아하고, 앞으로 또 하고싶은지 간단하게 이야기했다.

 

나의 장단점

: 짜여진 계획이 틀어지면 불안해 하는 단점을 먼저 설명한 다음, 요즘에는 이 단점을 보완하면 준비성이 철저하고 계획적이라는 장점이 될 수 있다는 것을 깨달아 장점으로 승화시키려 노력중이다, 이렇게 단점에 좌절하지 않고 장점으로 보완하고자 하는 자세가 장점이라고 생각한다 이런 식으로 말했던것 같음!

 

지원서로 제출한 '만들고 싶은 서비스'에 대한 간단한 설명

: 이거 설명할 때 시간이 부족해서 중간에 뚝 끊겼다. 지원서에 자세하게 설명해 뒀는데 또 질문한 이유는 아마 약간 PR 해보라는 식으로 내 준것 같았음. 핵심만 뽑아서 내 서비스 어때? 괜찮지? 식으로 말했어야 하는데 기억나는 지원서 내용 줄줄 읽는 바람에 시간도 부족하고 아쉬웠던 답변이었다ㅠ

 

열정을 가지고 일했던 경험

: 학생회 경험 이야기함. 학생분들을 위해 봉사하는 보람, 그 과정 속에서 느낀 재미, 얻은 것들, 뿌듯함 등을 위주로 이야기 했던 것 같다.

 

내 아이디어를 관둬야 하는 상황이 온다면 어떻게 할 것인가?

: 다수결에 의한 결정이라면 따르겠다고 이야기했다. 내 아이디어가 반려된 납득할만한 이유가 분명 존재했을테니까.
반려된 내 아이디어는 그 문제점을 분석하고 다시 보완하여 다른 프로젝트에서 다시 도전해볼 것 같다고 이야기했다.

 

마지막으로 하고싶은 말

: 내가 되고싶은 개발자의 이상적인 모습을 이야기하고, 이 꿈을 이루기 위해 꼭 멋사에 합격하고 싶으며,
열심히 공부하고 싶다고 최대한 당차게! 이야기한 것으로 기억한다. 좀 쪽팔려도 완전 희망차게 이야기하려고 노력했던 기억이...

 

그 외 기타 질문

: 세션 시간 매주 ~인데 참여할 수 있는지? - 당근이죠 / 하고 있는 다른 동아리나 학회 있는지?- 아유 없어요

 

개별 질문 으로는 지원서에 작성해서 낸 '만들고 싶은 서비스' 중 '아트아이브' 서비스 관련해서 질문을 주셨다.

서비스에 부가적인 기능은 없는지, 웹사이트를 방문하는 사용자들과 상호작용 할 수 있는 기능 같은 것을 생각해본 적 있는지
여쭤보셨던 걸로 기억한다.


나와 같은 면접조로 만났던 분은 면접에서 탈락하셨다ㅠ

 

면접때 질문에 동떨어진 답변을 하거나, 약간 의욕이 없는 식으로 질문에 답변을 하시는 느낌이 있었는데

열정을 가지고 일해본 경험을 여쭤보셨는데 본인이 작업한 코딩 프로젝트 내용을 답변하신다던가,

본인이 작성한 서류의 내용을 잘 기억하지 못하는 느낌으로 답변을 하셨던 것 같다.

 

본인이 작성한 지원서 내용을 완벽하게 숙지한 다음,

질문을 침착하게 이해한 뒤 또박또박 자신있게 답변할 수 있다면 좋을 것 같다!

 

암튼 전체적인 면접 분위기는 편안하게 대화하는 형식이었고(답변에 시간 제한 있는 것만 빼면)

다들 친절한 눈빛으로 맞이해 주셔서 큰 부담 없이 진행할 수 있었다.


마지막으로, 내 생각에 지원자를 뽑을 때 가장 중시한 부분은

 

1) 웹 개발에 열정을 가지고 성실히 임할 수 있는 자세를 가진 사람인가 (정말 웹 개발을 하고싶은가)

2) 멋사에서 운영하는 활동에 적합한가 (이미 웹개발에 숙달되어 있는 사람은 적합하지 않음)

3) 협업 활동에 적합한 사람인가

 

이렇게 세가지 정도였던 것 같다. 특히 멋사는 기업이 아니라 교육을 제공하는 단체이기 때문에,

멋사에 이 사람이 정말 필요한가? 보단 이 사람에게 정말 멋사가 필요한가?를 기본 전제로 깔아두고 있는 것 같았다.
이 부분에 유의하며 지원 준비를 하면 가장 좋을 것 같다는 개인적인 생각!

 

 

끝으로 이 글을 보면서 멋사 지원을 준비하는 사람이 있다면

후회하지 않을 만큼 열심히 준비해서 꼭 합격할 수 있었으면 좋겠다. (๑'ᴗ'๑)

 

 

멋쟁이사자처럼에서 경험한 1년간의 활동이 2021년 연말을 기점으로 막을 내렸다.

1년동안 멋사에서 배운 것, 만들어본 것들은 차차 정리하기로 하고

 

멋사 9기 지원을 준비할 때 찾아본 지원 후기들에 많은 도움을 받아서 나도 합격하면 꼭 정리해둬야지! 했지만...

수많은 과제와 프로젝트의 파도에 떠밀려 2022년까지 와버린...

암튼 그걸 10기 모집이 시작되기 전에 서류/면접 두개의 포스팅에 걸쳐 정리해두려고 한다.

 

근데 사실 서류/면접 과정을 겪어본 결과 대학교마다 면접 질문이나 서류 내용이 크게 다르진 않은 것 같다!

멋사는 멋쟁이사자처럼 중앙 조직을 기반으로 대학마다 모집이 이루어지는 구조라 그런지

모집 대학 상관없이 찾아봤던 모든 자료가 서류 및 면접 준비에 도움이 됐었다.

그래서 학교 상관없이 서치해서 나오는 모든 글들이 지원 준비에 도움될 것이라 생각한다.

 

그리고 본론으로 들어가기 전에, 내가 작성한 방식과 내용은 모두 정답이 아니고,

내 서류가 꼴등 서류였을 수도 있기 때문에... 모든 내용은 참고용으로만 봐주시길!

 

먼저 나는 멋사를 학교 선배님들의 취업후기를 읽어보면서 처음 알게 되었다.

 

내가 재미있게 일할 수 있을 만한 직무를 유튜브/취업후기 등을 통해 살펴보다 웹개발에 관심이 생겼고,

웹개발 분야에 취직하신 선배님이 취업후기에 멋쟁이사자처럼 동아리를 추천해 주셔서 지원해 보기로 마음먹었다.

 

특히 웹개발에는 Django, React 같은 프레임워크 및 Java script, HTML 같은 언어 등이 사용되는데

우리 학교에서는 이런 웹개발 기술을 다루는 수업이 전혀 개설되지 않았기 때문에

코딩 초보도 웹개발 기술을 배울 수 있는 교육을 제공해줌과 동시에, 나처럼 웹개발에 관심있는 사람들과 팀프로젝트를 진행할 수 있는 기회도 제공해주는 동아리였기 때문에 꼭 지원하고 싶었다


내가 지원한 9기 모집은 아래와 같이 진행되었다.

 

서류 접수 2021.02.22 - 2021.03.12

서류 발표 2021.03.13

온라인 면접 2021.03.15 - 2021.03.17 (약 20분)

최종 발표 2021.03.19

 

서류는 기본 문항 4개에 대한 답변와 포트폴리오(선택)를 제출하는 방식으로 이루어졌다.

개인적으로 운영하는 블로그나 깃허브 주소도 기입할 수 있어서 정리해둔 사이트가 있다면 제출해도 좋을듯

 

기본 문항은 대학마다 조금씩 차이가 있는 것 같고, 포트폴리오는 합격 후 사람들에게 물어본 결과

제출한 사람과 제출하지 않은 사람이 반반 정도였던 것 같다. 나는 포트폴리오도 간단하게 만들어서 제출했음

 

기본 문항 4개는 다음과 같았다.

 

1) 지원동기

2) 만들고 싶은 서비스

3) 타인과 협업했던 경험과 그 과정에서 자신이 수행한 역할(700자)

4) 인상 깊었던 서비스를 짧게 소개하고, 그 서비스의 장점과 개선점(800자)

 

1, 2번은 글자수 제한이 없어서 1번은 800자, 2번은 1500자 정도로 작성했다.

내가 쓴 내용을 전부 올리기는 부끄럽기도 하고... 내용도 너무 많기 때문에, 작성할 때 어떤 부분에 집중하여 작성했는지 핵심만 간단히 정리해보도록 하겠다.


1. 지원동기 : 멋쟁이사자처럼이 내게 필요한 이유

지원 동기는 다음과 같은 흐름으로 작성했다.

 

내가 웹 개발에 관심을 가지게 된 계기 → 개발 지식의 필요성을 느끼고 컴퓨터공학과 복수전공 시작

→ 학부 과정에서 웹개발 교육과 경험에 한계를 느낌 → 웹개발 지식 및 프로젝트 경험을 쌓기 위해 멋사 지원

 

지원 동기를 작성할 때는 내가 얼마나 대단한 사람인지를 강조하는게 아닌, 나에게 무엇이 부족하고,

그것을 채워주기 위해 멋사가 필요하다는 것을 어필하는데 집중했던 것 같다.

나는 멋사가 이만큼 필요해! 그래서 멋사에서 활동하고 싶어! 나 뽑아주면 진짜 열심히 배우고 활동할게!

의 마음을 진솔하게 표현하려고 노력했다.


2. 만들고 싶은 서비스 : 사회에 필요하거나, 내가 하고싶거나

처음에는 나와 내 주변 사람들의 생활에 편리함을 줄 수 있는 서비스를 생각하다가,

내가 정말 재미있게 시간가는 줄 모르고 개발할 수 있는 서비스도 문득 해보고 싶어서 만들고 싶은 서비스에는 두가지를 작성하기로 했다.

 

제안한 첫번째 서비스는 지도 기반 지역정보 공유 서비스 였고,

두번째 서비스는 케이팝 아티스트의 연대기를 시·청각적으로 보여줄 수 있는 웹사이트 였다.

서비스를 구구절절 설명하지는 않겠다! 대신 포트폴리오 자료에 추가한 간단한 서비스 설명을 아래에 첨부한다.

 

포트폴리오 자료 마지막 페이지에 추가한 서비스 설명자료

아무튼 하고 싶은 말은, 정말 기발한 발명왕 아이디어 같은게 떠오르지 않는다면 본인이 좋아하고 관심이 많은 주제를 생각해보는 것을 추천한다.
예를 들어 내가 평소 게임하는 것을 좋아한다면, 데이터에 기반해 사용자들에게 취향 맞춤 게임을 추천해주는 서비스를 만들어 볼 수도 있고, 게임 유저들이 게임 리뷰 또는 공략을 편리하게 공유할 수 있는 서비스를 만들어 볼 수도 있을 것이다.

 

그리고 보통 IT 서비스 하면 스마트폰 앱을 떠올리는 경우가 많은데,

멋쟁이사자처럼은 웹개발웹서비스를 중심으로 다루는 동아리이기 때문에 웹서비스와 앱서비스의 차이를 이해하고,

지원서에 앱 서비스를 서술하여 제출하는 일이 없도록 주의하자.

이런 부분은 멋사 공식 홈페이지(www.likelion.net)에 있는 멋사 소개 및 제공 교육 등을 다시 한 번 읽어보는 걸 추천한다.


3. 타인과 협업했던 경험과 그 과정에서 자신이 수행한 역할 : 나는 팀 프로젝트에 적합한 사람일까?

멋사에서 팀 프로젝트를 해 본 결과,

팀원이 개인 스케줄이 바쁘다는 이유로 프로젝트에 성실하게 임하지 않거나

개발 지식이 부족함에도 공부를 게을리하여 프로젝트 진행에 차질이 생기는 경우,

팀원들과 소통하지 않고 독단적으로 일을 진행하다가 문제를 키우는 경우가 가장 크리티컬한 문제였던 것 같다.

 

그래서 본인이 협업한 경험과 협업할 때 중요하다고 생각했던 부분,

그것을 위해 나는 어떤 자세로 팀 프로젝트에 임할 수 있는지를 보여줄 수 있는 문항이라고 생각한다.

 

나는 학생회 하면서 돕바 공동구매 했던 경험을 썼는데 처리할 개인 정보도 많았고, 학생들의 돈을 다루는 일이라 분업과 상호 소통,
크로스체크가 필수적이었으며 이것저것 문제도 많았던 경험이라 쓰기 적합한 소재였던 것 같다.

 

내가 어떤 역할을 맡았고, 어떤 문제를 겪었으며, 그 문제를 어떻게 해결했는지,
그 과정에서 무엇을 배웠는지(협업에선 이런 부분을 신경써야 한다던가 등) 등을 위주로 작성했다.


4. 인상 깊었던 서비스에 대한 소개와 그 서비스의 장점/개선점 : 내가 서비스를 개발할 때 중시하는 것

이 질문은 내가 서비스 개발에 있어서 중시하는 것이 무엇인지,

그리고 그것이 아주 잘 담겨있는 시중의 서비스는 무엇인지를 소개할 수 있는 문항이라고 생각했다.

 

나는 단순히 생활을 편리하게 만들어 주는 서비스 보다 사용자들에게 새로운 감정과 경험을 주는,

재미있고 독특하다! 라는 느낌으로 사용자들을 사로잡는 서비스를 좋아했기 때문에

Interactice Developer 라는 유튜브 채널로 유명한 김종민 개발자님의 서비스 'NONI NONI'를 소개했다.

(https://www.youtube.com/c/cmiscm) / (https://noni.cmiscm.com)

마냥 유명하고 우수한 웹서비스를 소개하는 것도 좋겠지만, 내가 좋아하는 것 그리고 내가 서비스 개발에 있어서 중시하는 것이 잘 담겨 있는 좋은 프로젝트들을 소개하면 '나' 라는 사람을 더 잘 표현할 수 있다고 생각했던 것 같다.


5. 포트폴리오 : 개발에 대한 흥미도

포트폴리오는 내가 지금까지 했던 프로젝트들에 대한 정리와,

기본문항 2번의 만들고 싶은 서비스를 간단하게 시각화한 자료를 PDF로 제출했다.

대단한 프로젝트 경험이 있는 것도 아니었기 때문에 내가 얼마나 개발에 흥미가 있는지,

멋사에서 가르쳐주는 지식을 통해 내가 무엇을 만들고 싶으며 정말 그것을 만들 수 있는 끈기와 책임감을 가진 사람인지를 보여주는데 중점을 두었다.

 

이런식으로 약 10페이지 가량의 포트폴리오 PDF 파일을 만들어 제출했다.

But 위에서 말한 것 처럼 포트폴리오는 필수 제출이 아니고,
포트폴리오 없이 합격한 사람도 많았기 때문에 부담 가지지 않았으면 한다.

 

 

면접 합격 후기는 글이 너무 길어지는 관계로 다음 포스팅에 이어서 작성하겠다!

제출한 지원서는 재열람이 불가능했기 때문에 면접 준비를 위해선 따로 문서로 저장해 두는게 좋다.

 

 

Spring 공부하다가 우연히 웹 배너 광고를 통해 발견한 프로그래머스 백엔드 데브코스

정확한 명칭은 프로그래머스 데브코스 : 클라우드 기반 백엔드 엔지니어링으로,
카카오 및 여러 기업의 코딩테스트를 진행하는 것으로 유명한 프로그래머스가 주관하여 5개월간 진행하는 국비교육 코스이다.

 

지원 준비 과정에서 다양한 합격 후기들을 읽어본 것이 많은 도움이 되었기에,
추후 지원을 계획하는 사람들에게 나 역시 조금이나마 도움이 되고자 합격 후기를 작성하게 되었다.


백엔드 데브코스는 현업에서 많이 사용하는 Java와 Spring클라우드 배포 중심의 백엔드 개발 교육을 제공한다.
국비지원이므로 당연히 교육료는 공짜! 대신 프로그램에 참여하기 위해선 내일배움카드를 발급받아야 한다.
본인이 내일배움카드 발급 대상인지의 여부는 hrd net 사이트에서 발급 신청을 해보면 알 수 있다.
(https://www.hrd.go.kr)

 

대학생의 경우 졸업까지 남은 학기 수가 1학기인가 2학기 이하여야 했고, 이를 증명하기 위해 재학증명서를 첨부해야 하니
나처럼 대학교 재학중인 상태라면 이 점을 유의하면 좋을 것 같다.


데브코스에 지원하게 된 이유는 어차피 Spring을 공부하고 있기도 했고,
교육에 참여하면 직접 커리큘럼 관리하고 과제 만드는데 드는 많은 시간을 절약할 수 있었기 때문에 마침 좋은 기회라 생각했기 때문이다.
특히 취업준비 단계가 되니 같이 코딩테스트나 기술면접 스터디를 진행하기 좋은 개발자 네트워크가 필요했다.

 

본격적으로 지원 과정에 들어가기에 앞서 합격 후기와 활동 후기 위주로 많이 찾아봤는데, 직장을 다니다가 지원하신 분들도 많이 계셔서 처음에는 좀 겁을 많이 먹었다. 좀 더 공부하고 와야하나 싶기도 했지만 지원 과정을 밟아 나가면서 점차 자신감이 생긴듯.

 

교육 대상 선발 과정은 서류 > 코딩테스트 > 면접 순으로 이루어졌다.


1. 지원서 작성

이번 백엔드 2기의 지원서 문항은 아래와 같았다.

 

1) 지금까지 내가 어떻게 프로그래밍을 학습해왔는지 이야기를 들려주세요. 그리고, 지금 지원하는 데브코스에서 어떻게 꾸준히 학습을 이어나갈 계획인지 알려주세요. (300자 이상)

2) 프로그래머스 백엔드 분야로 진출하고자 하는 이유가 무엇인가요? 단순한 호기심으로 견디기에는 높은 강도의 커리큘럼이 나를 기다리고 있습니다. 자신의 명확한 신청 동기를 알려주세요. (300자 이상)

3) 이전에도 백엔드 관련한 학습 또는 프로젝트를 경험한 적이 있다면 그 경험에 대해 최대한 자세히 들려주세요. 외부 링크가 존재하는 경우 붙여 넣어주셔도 좋습니다.

4) 위의 항목에서 미처 답변하지 못했던, 나의 장단점을 자유롭게 이야기해주세요.

 

데브코스 지원자 카카오톡 오픈채팅방이 있길래 들어가봤는데, 분량은 300자 내외로 맞춰 쓰신 분도 있었고 아닌 분들도 있었다.
나는 투머치 토커 경향이 있어서 1,3번은 1500자 내외로 작성하고 2번은 1000자, 4번은 800자 내외로 작성했는데,
면접 준비를 하며 지원서를 여러번 읽다 보니 좀 더 줄였어도 됐을법 했다.

 

아무래도 지원자가 많다보니 내용은 핵심만 담아서 간결하게 쓰는 것이 심사하는 사람 입장에서도 읽기 편할 것 같더라.
쓸 말이 많다 싶으면 1000자 내외, 간결하게 핵심만 정리가 가능하다 하면 800자 내외가 개인적으로 괜찮을 듯 싶다.

 

지원서 작성에 있어서 가장 중요하게 생각한 점은 나에게 이 교육이 필요함을 어필하는 것과,교육을 성실하게 이수할 수 있는 끈기와 계획성을 어필하는 것 이었다. 기업 채용 절차가 아니고 교육을 제공하기 위한 선발과정이었기 때문에, 정말 교육이 필요한 사람과 교육을 제공해 주었을 때 성장가능성이 있는 사람, 그리고 성실하게 교육과정에 임할 수 있는 사람을 뽑고자 할 것이라고 생각했다. 그래서 나에게 얼마나 이 교육이 필요한지, 어떤 확고한 목표가 있는지, 얼마나 계획적이고 끈기있게 학습을 진행하는지를 지원서에 어필하고자 노력했던 것 같다.

 

하루에 한두문항씩 작성하여, 지원서를 완성하기까지는 총 3일 정도가 걸렸다.

제출한 지원서는 재열람이 불가능 했으므로 면접 준비를 위해 문서로 저장해 두었다.

 

 

제출한 지원서 합격 여부는 지원 마감일 바로 다음날 메일로 통보되었다.

통보 시기가 빠르기도 했고, 탈락자가 거의 없는 것으로 보아(오픈카톡 나가는 사람 없음) 세부적인 지원서 검토는
코딩테스트 시행 후 어느정도 선발이 이루어진 후에 진행되는 것 같았다.


2. 코딩테스트

코딩테스트 준비는 완전 벼락치기로 했다...ㅎ
프로그래머스 Lv.2 문제를 무난하게 풀 수 있다면 걱정하지 않아도 된다고 안내되었지만,
난 시간이 부족해서 프로그래머스 Lv.1 문제들만 주구장창 풀다가 테스트를 보게 되었다.
4일 동안 Java + SQL Lv.1~2 문제들을 풀었고, 알고리즘 문제는 
Java 언어만, SQL 문제는 mySQL과 Oracle을 사용할 수 있었는데
수업시간에 사용해본 경험이 있는 Oracle이 좀 더 익숙했으므로 해당 언어로 준비하고 시험을 치뤘다.

 

풀이 결과는 알고리즘 1.8(?)/3 , SQL 2/2 , 객관식 20/20(아마도)

 

알고리즘 첫번째 문제는 모든 테스트 케이스를 통과했고,
두번째 문제는 테스트케이스 20개 정도? 중 2개를 제외하고 모두 통과했다. 3번째 문제는 읽지도 못하고 시간이 오버되어 테스트 종료ㅠ

두문제는 완벽하게 풀어야 안정권이라고 생각했는데, 1번 문제에서 삽질하느라 시간을 뺏겨 아쉬웠다.
코테는 문제풀이에 필요한 올바른 알고리즘을 신속하게 결정하는게 핵심인 것 같다. 효율성 검사는 없었고 정확도 검사만 시행되었다.

 

SQL은 두 문제 모두 정답을 내는데 성공했고, 객관식은 정답 여부를 알려주지 않았지만 난이도가 어렵지 않았기 때문에
실수만 안했다면 다 맞았을 것 같다. 문제는 웹개발/네트워크/Java 관련 개념들로 구성되어 있었다.

 

Java 사용에 익숙하진 않았지만, C/C++과 언어구조가 비슷했기 때문에 코테 연습을 몇번 해보니 금방 익숙해질 수 있었다.
대신 나는 C 언어 사용에 절여져있었기 때문에ㅎ 객체지향은 거의 사용하지 못했다.
라이브러리는 테스트 중 구글링이 가능해서 필요한 것들은 찾아서 사용했다. Java 연습은 앞으로 특히 객체지향 중심으로 많이 해야할 듯.

 

 

코테 + 서류 합/불 결과 및 면접 안내 메일은 코테를 본 날로부터 3일 이후 메일로 통보되었다.

오픈카톡방 반응으로는 코테가 꽤 어려웠다고 하는데, 그래서 완벽한 2솔이 아니었음에도 통과할 수 있었던 것 같다.
1솔 + 나머지 두 문제 부분점수로 합격하신 분도 계셨고, 1솔 + 나머지는 전혀 풀지 못한 분은 탈락하시는 등 정도의 난이도였던 것 같다.
물론 합격 여부는 모르지만 3솔인 분들도, 0솔인 분들도 계셨다.


3. 온라인 면접

면접은 지원서를 5번 정도 읽고면접 후기들을 최대한 많이 읽어보면서 공통질문에 대비하는 방식으로 준비했다.

하필 면접 기간(2/24~3/3)의 끄트머리에 배정받는 바람에 그냥 내 할 일 하다가 면접 3일 전에 전력으로 준비하는 방식을 택했다.

 

일단 지원서를 5번정도 읽어서 내가 쓴 내용을 완벽하게 숙지하려고 노력했고, 면접에서 일관성있는 대답을 할 수 있도록 연습했다.
그리고 구글링을 통해 면접 후기들을 보며 나올만한 
공통 문항들을 정리한 다음 그에 대한 답변을 정리하고 소리내서 읽는 연습을 했다.
면접 후기는 
백엔드/프론트/인공지능 구분하지 않고 모든 데브코스 면접후기를 읽어본게 많은 도움이 되었다.

 

면접은 약 1시간 정도 진행되었고, 지원자 4명과 면접관 1명의 다대일 면접으로 이루어졌다.
인성관련 질문 위주였기 때문에 편안한 면담 분위기에서 면접이 이루어져서 나 역시 편하게 대답할 수 있었다.
특히 질문들이 면접 준비 과정에서 다 한번쯤 생각해본 것들이여서 다행이었다.

 

사실 면접 준비 과정에서 어떤 질문이 나왔는지에 대한 포스팅에 많은 도움을 받았기 때문에, 나도 받은 질문들과 내 대답을 세세하게 정리하고 싶지만... 면접관님이 정보 유출에 각별히 주의를 부탁하셔서 간단한 힌트만 남기겠다.
본인이 무언가에 열정적으로 임해본/문제를 해결해본 경험이나 개발 학습 과정(과거+미래) 등을 천천히 정리해보면 많은 도움이 될 것 같다.
그리고 뻔한 대답보다는 차별성이 있는 대답이 나에 대한 각인을 남기기 좋다고 생각한다.

 

이번 면접에서 가장 당황했던 부분은... 바로 기술 면접. 기술 질문 안나온다매! 경험과 지원서 위주로 진행된다매!!

이번 기수에 새롭게 추가된 부분인지는 모르겠으나, 기술 질문이 나왔다... 면접자 일동 당황.

 

HTTP method 나 process 와 thread의 차이 등 웹개발/네트워크/운영체제 중심의 질문들이 나왔는데,
깃허브에 찾아보면 기술면접 준비를 위한 많은 자료들이 잘 정리되어 있으므로 면접 준비할 때 해당 자료를 읽어보면 좋을 듯 하다.
나는 기술면접은 없을줄 알고 전혀 준비를 안했기 때문에...아는대로 모르는대로 헛소리 줄줄 내뱉고 왔다ㅎ

 

사실 공부 안하고 있는건 알았지만, 이번 과정을 통해 내가 코테 + CS지식이 정말 부족한 상태라는걸 깨달았다.
그리고 취업을 위해 이것들이 얼마나 중요한가를 한번 더 깨달을 수 있었고... 이번 학기동안 꾸준히 공부해야겠다ㅠ


4. 최종 합격

최종 합/불 결과는 면접 기간이 종료된 날을 기준으로 4일 뒤 메일이 왔다.

컴퓨터공학을 복수전공까지 했는데 기술질문에 잘 대답하지 못해서 헛공부한 사람이라는 인상을 줬으면 어쩌나 걱정했지만,
다행히 합격 메일을 받았다! 지원 과정이 3주나 걸리다 보니 힘들긴 했지만 막상 합격하니 뿌듯했다ㅎㅎ

 

 

사실 다른 활동도 이것저것 알아보고 있어서 중간에 교육을 포기하는 상황이 오진 않을까 걱정이 많지만,
학교 수업 하나 더 듣는다는 생각으로 최대한 열심히 참여해보려 한다.
무엇보다 함께 교육받는 분들이 다들 선발 과정을 통과한 사람들이라 함께 공부하면서 많은 점들을 배울 수 있을 것 같아 기대된다. 화이팅!

 

 

지난 포스팅에서는 주피터노트북에서 csv파일을 불러오는 방법과
(https://agentsmith.tistory.com/6)

데이터를 다양한 종류의 막대그래프로 도식화 하는 방법을 알아보았다.
(https://agentsmith.tistory.com/7)

이번 포스팅에서는 주어진 데이터를 가지고 표 이미지를 생성하는 방법을 알아보자.

 

1. 표 생성하기

pip install dataframe_image
import pandas as pd
import dataframe_image as dfi
 

주피터노트북에서 파이썬을 이용해 표를 그리기 위해서는 pandas 라이브러리와

dataframe_image 라이브러리가 필요하다. dataframe_image는 지난 포스팅에서 설치한 적이 없기 때문에 설치를 먼저 해주고 import 하자.

 

라이브러리가 준비되었으면 간편한 표 생성을 위해 df_maker라는 함수를 하나 선언해줄 것이다.

 

def df_maker(row_num, col_num, fill):
    col = [];ind = [];con = []
    for i in range(0,col_num):
        col.append(fill)
    for i in range(0,row_num):
        ind.append(fill)
    for i in range(0,row_num):
        con.append(col)
    return pd.DataFrame(con, columns=col, index=ind)
 

row_num은 행의 개수가 되고, col_num은 열의 개수가 되며 fill은 처음 생성되는 표에 채워지는 값이다.

즉 df_maker(2, 3, 0) 식으로 함수를 호출하게 되면 행이 2개, 열이 3개이며 모든 칸이 0으로 채워진 표가 생성된다.

 

 

표의 뼈대가 완성되었으니 이제 내용을 채우는 방법을 알아보자. 아래 코드의 주석을 보면 이해하기 쉽다.

 

df = df_maker(2,3,0)
df.columns = ['딸기','바나나','사과'] # 각 열의 top값
df.index = ['가격','개수'] # 각 행의 top값
df['딸기']=[100,3] # '딸기'열의 값 채우기
df['바나나']=[250,4] # '바나나'열의 값 채우기
df['사과']=[300,1] # '사과'열의 값 채우기
df.columns=pd.MultiIndex.from_product([['< 강아지 농장 과일가게 >'],df.columns])

각 행의 top 값의 범주를 추가하고 싶은 경우, 아래와 같이 df.index를 추가해 주면 된다.

 

df.index = [['메뉴','메뉴'],['가격','개수']]

pandas 테이블 생성의 경우 하나의 열에 여러개의 동일한 값이 들어가면 위와 같이 하나의 블럭으로 합쳐진다.

그래서 [ '메뉴', '메뉴' ] 이렇게 두번 작성된 리스트를 [ '가격', '개수' ] 리스트 앞에 넣어주면 위 그림처럼 표가 생성되는 것이다. 조금 번거롭지만 하나의 블럭으로 만들고자 하는 열은 행의 개수만큼 그 단어를 반복해 줘야 한다(위에서 '메뉴'를 총 행 개수인 2번 만큼 반복해 준 것 처럼). 아래처럼 for 문을 이용하면 손쉽게 같은 단어가 여러번 반복 저장된 리스트를 만들 수 있다.

 

x = []
for i in range(10):
    x.append('메뉴')

2. 표를 이미지로 저장하기

표를 이미지로 저장하는 것은 위에서 import 해 준 dataframe_image 라이브러리를 사용하면 간단하다.

 

dfi.export(df, '새로운 표.png')
 

dfi.export 함수를 사용하여 (생성한 표의 변수명, '저장할 이미지 이름.png') 를 선언해주면 주피터노트북 홈 화면에서 새롭게 저장된 표 이미지를 확인할 수 있다. 해당 이미지를 다운로드 해주면 된다.

 

다운받은 '새로운 표.png' 이미지

지금까지 총 세번의 포스팅에 걸쳐 파이썬을 이용하여 csv 파일을 읽고 그래프/표로 도식화 하는 방법을 알아보았다.

pandas 라이브러리에는 이 외에도 csv 파일과 표를 편리하게 분석할 수 있는 많은 함수들이 있고,

각 함수마다 다양한 옵션이 존재하니 잘 사용하면 빠르고 편하게 데이터를 도식화 할 수 있다.

 

아래 도서에 관련 내용이 잘 정리되어 있으니 관심있는 경우 읽어보는 것을 추천한다.

 

파이썬 데이터 사이언스 핸드북 (http://www.yes24.com/Product/Goods/50330345?isDeviceRedirect=n)

+) 영어 원서는 인터넷에 무료로 풀려 있어서 아래 링크를 통해 다운로드 받을 수 있다.

(https://tanthiamhuat.files.wordpress.com/2018/04/pythondatasciencehandbook.pdf)