이력서면접간단히 자기소개 가능하신가요?이력서를 보니까 읽기 좋은 코드에 관심이 많다고 하셨는데 따로 노력하신게 있으실까요?문서화는 왜 중요하게 생각하나요?마감기한은 왜 중요하게 생각하나요?함께 성장하는 문화를 왜 지향하나요?꾸준함을 왜 중요하게 생각하시나요?기술면접진행했던 프로젝트에 대해서 설명해 주실 수 있나요?프로젝트에서 사용한 기술스택에대해 설명이 가능한가요?자바 17버전을 사용한 특별한 이유가 있을까요?그렇다면 자바의 버전별 차이를 알고 계신가요?프로젝트에서 기여한 역할이 무엇인가요?이미지 업로드에 대해서 더 상세히 설명해주실 수 있나요?HTTPS 보안이 어떻게 이루어지나요?CI/CD 워크플로우를 설명해 주실 수 있나요?경험면접교육을 두개 들으셨는데 그 이유가 있으실까요?책 스터디주로 객체지향에 대해서 스터디를 많이 하신 것 같은데 기억남는 부분이 있으신가요?이펙티브 자바에서는 어떤게 인상깊었나요?
이력서면접
간단히 자기소개 가능하신가요?
- 네. 안녕하세요 저는 백엔드 개발자 김형욱이라고 합니다. 대학교 전공을 나와서 부족함을 많이 느껴 바로 취업하기 보다는 실무적인 역량을 조금이라도 쌓고 개발문화가 좋은 회사에 가고 싶었습니다. 약 1년 6개월간의 취업준비 기간동안 개인적인 공부와 더불어 코드숨, 프로그래머스 백엔드 데브코스 부트캠프를 통해 백엔드 개발자가 갖춰야할 기본적인 역량을 쌓아 왔습니다.
- 저는 나무같은 개발자가 되고 싶습니다. 한 기술에 종속되어 있는 개발자보다는 나무가 종이, 책상, 의자가 되는 것처럼 회사에 맞는 적정한 개발자가 되기 위해 끊임없이 노력하는 개발자가 되겠습니다.
이력서를 보니까 읽기 좋은 코드에 관심이 많다고 하셨는데 따로 노력하신게 있으실까요?
- 네 읽기 좋은 코드는 결국 유지보수와 직관된다고 생각합니다. 저는 자바 언어를 이용해서 현재 공부를 하고 있었기 때문에 객체지향을 잘 이해하고 작성하는것이 중요하다고 생각하였습니다.
- 따라서 객체지향의 기본적인 본질 캡슐화, 상속, 추상화, 다형성 등을 깊고 잘 이해하기 위해 객체지향의 사실과 오해, 오브젝트 등의 책을 읽으며 객체지향 본질에 대해서 알아가고 있습니다.
- 또한 깔끔한 코드의 대표적인 책으로 클린코드도 조금씩 읽고 정리하고 있습니다.
문서화는 왜 중요하게 생각하나요?
- 문서화의 중요성으로 저는 크게 두가지로 설명을 드릴 수 있을 것 같습니다.
- 첫번째는 문서화가 습관화 된다면 함께 성장하는 문화가 자연스럽게 따라오는 것이라 생각합니다. 제가 겪었던 문제 또는 제가 새롭게 알게 된 내용을 정리하고 공유함으로써 누군가는 알고 있겠지만 저처럼 처음 알게 되거나 겪어보지 못한 분들에게는 중요한 자료가 될 것이고 회사에서도 개발 진행에 있어서도 원할할 것이라고 생각되어 중요하다고 생각합니다.
- 두번째로는 팀원간의 의사소통입니다. 제가 지금까지 현재로 겪었던 팀 프로젝트에서는 회의를 진행함에 있어서 팀원간의 이해도가 서로 조금씩 차이가 있어서 중간중간 개발진행이 어려웠던 적이 있었습니다. 이러한 회의한 내용이나 정책을 문서화가 이루어진다면 그 문서화를 통해 이해하고 까먹을 수 있는 내용을 찾아볼 수 있기 때문에 리소스 측면에서도 문서화는 굉장히 중요하다고 생각됩니다.
마감기한은 왜 중요하게 생각하나요?
- 저는 냉정히 서비스를 사용자 측면에서 바라볼때 사용자는 개발자가 아닌 이상 코드에 관심이 전혀 없다고 생각합니다. 그만큼 사용자가 원하는 서비스를 문제없이 이루어질 수 있도록 하는게 1순위라고 생각합니다.
- 따라서 마감기한에 어떤 서비스 개발이 목적이 분명하게 정해져 있다면 코드의 유지보수성이나 가독성이 떨어지더라도 그런 부분은 뒤로 미루고 사용자의 서비스를 위해 먼저 피처개발을 완료하고 뒤로 미뤄야 한다 생각을 가지게 되어서 코드 품질 또한 중요하지만 굳이 중요도를 정렬해 보자면 현실적으로는 마감기한이 우선이라고 생각됩니다.
함께 성장하는 문화를 왜 지향하나요?
- 개발자는 결국 팀으로 이루어지기 때문에 이기적인 개발은 없다고 생각합니다. 알고있는 내용한에서 공유하고 서로 배움으로써 코드의 품질은 높아지며 그에 대한 효과는 회사의 성장에서도 도움이 될 것이라 생각을 하고 있기 때문에 함께 성장하는 문화를 지향합니다.
꾸준함을 왜 중요하게 생각하시나요?
- 한 기술에 종속되는 개발자는 결국 한계가 있다고 생각합니다. 저는 어떤 부분이든 항상 단계를 밟아가며 전보다 더 나은 개발자 또는 제 자신에게 떳떳한 사람이 되고 싶었습니다. 한 기술에 안주하게 된다면 마음은 편할지 몰라도 저의 삶의 가치관에 있어서 뿌듯함이 별로 없을 것 같았으며 그런 삶은 원하지 않았습니다.
- 이 부분은 어떤 회사든 중요하다고 생각합니다 회사는 꾸준하게 성장을 해야하며 그 과정에서 저 또한 분명히 같이 성장할 것이라 생각하기 때문에 꾸준함이 중요하다고 생각합니다.
기술면접
진행했던 프로젝트에 대해서 설명해 주실 수 있나요?
- 네 최근에 진행했던 프로젝트로 스포츠 패밀리라는 프로젝트를 진행했습니다.
- 스포츠 패밀리는 위치 기반으로 자신의 동네에서 다양한 스포츠 종목에 대하여 팀전, 개인전 매칭을 통해 경기 전적과 후기를 관리해주면서 운동의 의지를 더욱 도모하고 신뢰있는 게임을 할 수 있도록 도와주는 서비스입니다.
프로젝트에서 사용한 기술스택에대해 설명이 가능한가요?
- 네 가장먼저 자바는 17버전을 사용했습니다.
- 스프링부트는 2.7.1 버전을 사용했고 추가적으로 JPA, Security를 사용했습니다.
- 데이터베이스는 Mysql을 사용했으며 토큰관리를 위해 Redis도 사용하였으며 데이터베이스 형상관리를 위해 플라이웨이를 사용했습니다.
- 인프라는 AWS에있는 서비스를 이용하여 구축했습니다. 사용한 서비스로는 ec2, rds, s3, alb, cloudwach등이 있습니다.
- 외부 라이브러리로는 쿼리 작성을 보다 더 코드처럼 작성하기 위해 querydsl을 사용했습니다.
자바 17버전을 사용한 특별한 이유가 있을까요?
- 개발자라면 자신이 사용하고 있는 기술의 발전이 어떻게 이루어져 있는지 계속해서 관심을 가져아한다고 생각을 했습니다.
- 따라서 17버전을 사용했으며 비록 저희 코드에는 record, 개선된 switch문 정도로 사용하고 seald 클래스는 비록 사용하지 못했지만 추가적으로 팀원끼리 리팩토링 계획을 잡고 있어 자바 버전을 더 적극 활용하여 개선시킬 계획을 가지고 있습니다.
그렇다면 자바의 버전별 차이를 알고 계신가요?
- 네 대표적으로 많은 변화가 있었던 8부터 설명을 드리겠습니다. 자바8에서 람다, 스트림, 인터페이스 디폴트 메서드, 옵셔널, LocalDateTime등이 나왔습니다.
- 람다는 익명클래스의 사용을 람다를 이용하여 더욱 간결하고 직관적으로 구현이 가능합니다.
- 스트림은 컬렉션을 처리하면서 발생하는 반복적인 코드문제와 멀티코어 활용 어려움이라는 두가지 문제를 해결할 수 있습니다.
- 자바9 에서는 모듈 시스템이 등장하게 되었습니다.
- 옵셔널에서 ifPresentOrElse가 새로 추가되었으며
- 인터페이스에서 private method를 사용할 수 있게 되었습니다.
- 또한 컬렉션을 쉽게 구성할 수 있는 몇가지 추가 기능이 나왔습니다.
- 자바 10은 지역변수 유형에 대해 추론할 수 잇는 var 키워드가 추가되었습니다.
- JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당이 가능하게 되었습니다.
- 자바 11에서는 Oracle JDK 와 OpenJDK 가 통합되었습니다.
- 람다 지역변수의 사용법이 변경되었습니다.
- 자바 14에서는 스위치문이 표준적으로 개선되었으며 레코드 선언 기능이 추가되었습니다.
- 자바 15에서는 실드 클래스가 처음 나왔으며 그 기능은 17에서 기능이 완료되었습니다.
프로젝트에서 기여한 역할이 무엇인가요?
- 저는 가장 먼저 백엔드의 팀장 역할을 맡음으로써 스프린트 일정 조율 및 팀원간의 역할 및 업무를 할당하였습니다.
- 스프린트 주기는 보통 3~4일 주기로 가져갔으며 이슈가 생길 경우에 30~1시간이 지나도 해결이 되지 않을 경우 팀원 모두가 같이 해결하는 규칙을 정하여 프로젝트를 진행하도록 하였습니다.
- 개발 부분에서는 이번 프로젝트에는 CI/CD를 구축하고 HTTPS를 적용하였습니다.
- 또한 사용자 프로필 이미지, 팀 로고 이미지에 대해서 파일업로더 기능을 구현하였습니다.
- 스포츠 패밀리 프로젝트를 진행하기 전 인스타그램 클론코딩 프로젝트를 약 2주간 진행했었는데 거기서도 파일 업로드와 관련된 기능을 맡았습니다. 그땐 인프라 없이 로컬에서만 진행했기 때문에 이미지 업로드에 실패했을때의 롤백처리 등을 고려하고 코드를 작성했습니다.
- 하지만 사용자가 확장자를 강제로 변경하면 업로드되는 문제가 발생하여 이번 프로젝트에는 해당 부분을 막아주기 위핸 MimeType을 검증하도록 코드를 더 보완하여 작성했습니다.
- API에서는 사용자 관련 및 팀초대 관련하여 API를 구현하고 커서페이징을 적용하였습니다.
이미지 업로드에 대해서 더 상세히 설명해주실 수 있나요?
- 네 먼저 먼저 들어온 파일의 타입이 이미지 인지 아닌지 먼저 확인하여 컨트롤러에서 검증하도록 수행하였습니다.
- 일차적으로 이미지 파일이 맞다고 판단된다면 파일의 확장자 맞는지 시그니처 검증을 하고 업로드가 되도록 구성하였습니다.
- 프론트에서 막아줄 순 있다고 생각하지만 파일의 타입이 중요하다고 생각되는 곳에서는 검증을 어느정도 해야한다고 생각했습니다.
HTTPS 보안이 어떻게 이루어지나요?
CI/CD 워크플로우를 설명해 주실 수 있나요?
- 네 먼저 깃에 이벤트가 일어나면 Github actions에서 빌드 및 테스트를 진행하고 통과가 된다면 자르파일을 aws의 s3에 업로드하게 됩니다. 그 후 코드 디플로이에 배포를 요청하게되고 그 코드 디플로이가 자르파일을 저장한 s3에서 꺼내어 연결된 ec2 인스턴스에 배포를 하게됩니다.
경험면접
교육을 두개 들으셨는데 그 이유가 있으실까요?
- 네. 처음의 코드숨 과정을 들었던 이유는 항상 코드를 책과 인터넷 강의를 보면서 비슷하게 작성을 하다보니 잘 작성하고 있는지에 대한 고민이 많이 생겼었습니다. 그때 코드숨 과정을 알게 되었고 매주 과제를 통한 코드리뷰를 받을 수 있어 좋은 개발자가 되기위해 저에대한 투자를 아끼면 안된다고 생각을 했었습니다. 따라서 과정을 들었으며 코드리뷰의 중요성을 많이 느낄 수 있었던 계기가 되었습니다.
- 하지만 코드숨 과정을 듣고 취업을 준비하던 중 코드를 어느정도 깔끔하게 작성하려는 노력은 하고 있지만 정작 기초가 많이 부족하다는 것을 취업을 준비하면서 느낄 수 있었습니다. 취업을 계속 지원하고 떨어지는 중 프로그래머스 데브코스를 합격해서 고민을 좀 했지만 조금 더 기초적인 공부를 하고 싶어서 5개월간 조금 더 보충하는 시간을 가졌고 좋은 동료들과 많은 공부를 할 수 있었습니다.
책 스터디
주로 객체지향에 대해서 스터디를 많이 하신 것 같은데 기억남는 부분이 있으신가요?
- 네 저는 개인적으로 객체지향의 사실과 오해라는 책을 읽고 객체지향의 특성을 이해하는데 많은 도움이 되었던 것 같습니다.
- 그 중에서 추상화에 대한 이야기가 있었는데 이전에는 지하철 노선도는 실제 지형정보와 비슷하게 그려져 있어 사용자에게 노선도의 경로를 찾는데 많은 불편함이 있었다고 합니다. 사용자의 편의성을 위해 실제 지형정보를 지하철 노선도에서 아예 배제하고 역과 역 사이의 관계에만 집중하여 실제 지형과는 생김새가 전혀 다르지만 사용자의 편의성을 증대시킨 내용을 읽고 추상화를 이해하는데 어느정도 많은 도움이 되었습니다.
이펙티브 자바에서는 어떤게 인상깊었나요?
- 가장 많이 사용하고 실천하고 있는 부분은 빌더패턴인 것 같습니다. 이번 프로젝트를 진행할때도 필드가 네개 이상이라면 빌더패턴을 고려해보는 등의 규칙을 정하면서 개발을 진행했습니다.
- 인상깊었던 부분은 아직까지 어렵게 느껴지는 부분이긴 하지만 아무런 생각없이 사용하고 있던 제네릭에 대해 불공변, 공변, 반공변에 대한 내용을 몇번이나 읽었던 기억이 나는 것 같습니다.