- A1. 국내 일정 규모 이상의 서비스 혹은 플랫폼을 운영하는 경우 Spring Framework 기반의 Tech stack을 가지는 경우가 많습니다. 이것은 국내 인력들 대부분이 Spring 기반으로 개발을 시작하기 때문인데요. 단순히 취업을 목표로 하신다면 Java + Spring 베이스로 준비하시는 것이 낫습니다.
- A2. 만약 본인이 취업하고 싶은 분야가 확고한 상태라면 그 분류에 속하는 회사들의 Job Description, https://stackshare.io/private 또는 https://www.codenary.co.kr/company/list 등의 Stack share page들을 참고하면서 관련된 기술 스택을 학습하시는 것을 추천드립니다.
- A1-1. 별로 추천하지 않는 선택입니다. 대부분의 SI는 분야 특성 상 여러 회사의 수주 경쟁을 통해 프로젝트를 가져가는 방식을 취하고 있는데요. 이 경우 프로젝트 계약금이나 일정 등의 조건을 줄여 나가면서 경쟁하는 경우가 많습니다. 그렇기에 프로젝트에 참여했을 때 좋은 상황을 마주하기 힘든 편입니다. (업무 또는 개인을 위한 학습 시간과 여유, 임금이나 사수의 유무 등)
- A1-2. 그리고 SI는 프로젝트를 진행할 때 고려할 점들을 처음에 윗선과 고객의 커뮤니케이션을 통해 결정하고 내려주고 설계와 개발 순으로 진행하는 워터폴 방법론을 사용하기 때문에 개발 도중 고객의 변경사항을 쉽게 반영할 수 없어서 하드 코딩 등을 통해 어거지로 매꾸거나 넘기는 경우도 많습니다. (당연히 서비스 회사에서도 있을 수 있는 일이지만. 여기서의 논점은 "SI가 그럴 확률이 높다." 입니다.)
- A1-3. 위와 같은 상황에서 쌓을 수 있는 실력은 "기능이 돌아갈 수 있도록 하는 것" 즉 구현 능력 정도이며, 서비스, 플랫폼 회사에서 요구하는 구조 설계, 데이터 모델링, 서비스 운영, 장애 대응 경험들을 가질 수는 없다고 할 수 있습니다.
- A2. 상황적으로 너무 어려워서 SI를 가야 하는 상황이라면 어쩔 수 없으니.. 개인적으로 "최소한" 추천 드릴 수 있는 회사는 대기업 SI나 2차 협력사들 정도입니다.
- A1-1. 여기서 짚고 넘어가야할 것은 JPA는 Mybatis 나 JdbcTemplate 등의 네이티브 쿼리를 완전히 대체할 수 있는 것이 아니라는 점입니다. JPA는 좀 더 데이터베이스 엔티티를 객체처럼 다룰 수 있게 해주고 개발자가 엔티티에 해당하는 생성, 매핑 쿼리 등을 작성하는 것을 최소화 해주는데 많은 이점을 제공하지만, SQL을 이해하지 못하고 개발을 진행할 때에 발생하는 성능 이슈들과 성능 최적화의 어려움, 모델 간의 참조 관계, SQL에서 제공하는 문법을 모두 지원하지 않는 점 등의 (언급하지 않았지만) 여러가지 단점 또한 가지고 있습니다. 그렇기에 최근에는 프로젝트를 진행할 때 JPA 같은 ORM과 Native Query를 상호 보완적으로 사용하여 단점을 최대한 커버하는 식으로 개발하는 것이 좋다고하는 개발자들이 매우 많아 졌습니다. JPA + JOOQ, JPA + Mybatis 등..
- A1-2. 이제 통계로 말씀을 드린자면 JPA를 사용한다, 사용하지 않는다로 나누었을 때 3 : 7 정도 되는 것 같습니다. 프로젝트를 개발할 때 빠르고 편하게 요구 조건을 만족할 수 있는 것은 Native Query를 기반의 Transaction Script 방식이기 때문에 JPA를 제대로 활용할 수 없는 인력들이 들어와 사용해봤자 JPQL을 통해 쿼리처럼 개발할 가능성도 높고 생산성도(개발 한정) 떨어질 수 있으며, Native Query로 개발된 레거시 프로젝트에 JPA를 도입하려고 하다보면 설계 구조를 변경해야하는 경우가 많기 때문에 쉽게 도입하기 어렵습니다. (마음 먹고 도입하는 것이라고 해야겠네요.) 그렇기에 일정이 중요하고, 인력이 부족한 회사일수록 JPA를 도입하지 않는 경향이 있습니다. 관련 경험이 많은 기술 인력이 충분하고, 일정의 여유가 있는 서비스, 솔루션 기업의 경우 JPA를 사용하는 비율이 높아진느 편입니다.
- A2-1. 앞에서는 JPA 가 가지는 장/ 단점으론 무엇이 존재하고, 어떤 고려사항들이 있는지 간단하게(?) 작성 해보았습니다. 이제 개인적으로 추천하는 학습 수준으로 말씀 드리자면 "적어도 JdbcTemplate 수준의 API"를 활용하여 CRUD를 구현하고 Join을 통한 연관 관계 매핑과 Application Level의 Transaction을 관리해보는 경험을 한 다음에 어느정도 SQL에 익숙해졌을 때 JPA같은 ORM을 학습하는 것이 좋다고 생각합니다.
- A2-2. 이 질문은 대부분 "그 기술을 썻다고 하면 취업이 잘 되겠지? 혹은 JPA 요즘 많이 뜨는 것 같은데 나도 하는게 맞나?" 라고 생각하시는 분들이 자주하는 유형이라고 생각하는데요. 제가 생각하는 주니어 개발자를 뽑을 때 중요하게 보는 부분은 어떤 힙한 스택을 써본 경험이 아니라, 기술을 도입해야할 때 또는 문제를 해결해야할 때 어떻게 접근하고, 무슨 방법을 선택할지 결정하는 탄탄한 이론과 다른 팀원들에게 이를 공유하거나 발표하려고 하는 개발에 대한 열정 그리고 다른 사람들을 쉽게 이해시킬 수 있고 독선적이지 않는 협업, 커뮤니케이션 능력이라고 생각합니다.
내용은 계속 추가될 예정입니다.