성신전자에서 가장 기억에 남는 경험은 조달청에 자사 주력 상품을 등록한 일입니다. 입사 후 약 10개월이 지났을 때 겪은 경험으로 회사는 주로 '전기온돌판넬'이라는 바닥 난방 자재를 제작하는 공장을 운영하고 있었습니다. 하지만 이 제품은 가스난방이 주를 이루는 민간 아파트에서는 수요가 한정적이었고 원자재 가격이 상승하면서 이윤이 줄어드는 상황이었지만, 시장의 치열한 경쟁 때문에 판매가를 올릴 수 없는 어려움이 있었습니다. 이 문제를 해결하기 위해 방법을 모색중 공기관에 물품을 납품할 수 있는 나라장터 라는곳을 발견했습니다. 나라장터에 상품등록을 하기 위해서는 조달청이라는 기관의 심사를 통과 하여야만 했고 이를 위해 약 6개월 동안 공장의 생산 라인과 안전 수칙, 제품 제조 과정, 자재 성분 검사 등 다양한 심사 요소를 철저히 준비하여 심사에 통과해 상품을 등록하였습니다. 이후 첫 공기관 주문이 들어왔을 때, 그동안의 노력이 결실을 맺는 성취감을 느꼈습니다. 이 경험을 통해 새로운 시장 개척의 중요성을 배웠고, 회사의 수익성을 높이는 데 기여할 수 있어 큰 보람을 느꼈습니다.
성신전자에서 매출 증가를 위해 어떤 전략을 사용했나요?
성신전자에서 매출을 증가시키기 위해, 먼저 업무 효율성을 높일 방법을 고민했습니다. 제조 공장이기 때문에 하루 생산량이 정해져 있었고, 추가 판매가 이루어지더라도 야근수당과 추가 비용이 발생하면 이익률이 낮아진다는 문제를 인식했습니다. 이를 해결하기 위해 트리 방식을 활용해 제품의 생산 과정, 작업 방식, 보관 및 출고 방식을 세부적으로 분석하고 실현 가능한 부분을 분류해 나갔습니다. 그 결과, 기존 생산량을 월평균 20% 증가시킬 수 있었고, 이를 통해 회사의 수익성을 높이는 데 기여했습니다.
군복무 중 경험한 리더십 상황이 이후 직장 생활에 어떻게 도움이 되었나요?
군복무 중 경험한 리더십 상황이 이후 직장 생활에 큰 도움이 되었습니다. 구체적으로는 업무 파악 및 세분화 정리, 효율적인 업무 진행을 위한 인원 배치 관리, 체크리스트 작성으로 중복 업무 실수 최소화, 그리고 정기적인 PT 발표로 진행 상황 공유 같은 경험들이 있었습니다. 이러한 경험은 직장 생활에서 바로 적용할 수 있었습니다. 예를 들어, 업무를 체계적으로 분석하고 세분화하여 정리하는 습관은 프로젝트 관리에서 큰 도움이 되었고, 효율적인 인원 배치와 체크리스트 활용은 업무의 효율성을 크게 높이는 데 기여했습니다. 또한, 정기적인 진행 상황 공유는 회사 직원 들 간의 소통을 원활하게 하고, 협업을 촉진하는 데 중요한 역할을 했습니다
Java Spring을 사용한 프로젝트에서 가장 도전적이었던 부분은 무엇인가요?
백엔드 개발에서 팀원들과의 협업을 어떻게 진행하셨나요?
팀원들과의 협업을 진행할 때는 소통, 역할 분담, 코드 리뷰를 중심으로 진행했습니다. 프로젝트 초기 단계에서 팀원들과 명확한 목표 설정과 기술 스택 결정을 위해 충분한 논의 거쳤으며 정기적인 회의를 통해 각자 진행 상황을 공유하고, 발생한 문제를 함께 해결했습니다. 특히 디스코드와 노션을 활용하여 실시간으로 소통하며 작업의 효율성을 높였습니다. 팀원은 프론트 2명, 백엔드 2명으로 각자의 강점과 관심사를 고려해 역할을 분담하였으며 Github의 이슈 등을 최대한 활용하면서 API의 기능별로 코드를 작성, 코드리뷰를 실시함으로 서로의 코드 스타일과 로직을 이해할 수 있었습니다. 이 과정에서 새로운 아이디어나 개선점을 발견할 수 있었고, 코드의 일관성을 유지할 수 있었습니다.
프로젝트에서 Spring Boot를 활용한 경험을 설명해 주세요.
RESTful API 설계 경험이 있나요? 있다면 설명해 주세요.
Hibernate와 MyBatis 중 어떤 ORM을 선호하며, 그 이유는 무엇인가요?
CI/CD 파이프라인을 구축해본 경험이 있나요? 구체적으로 설명해 주세요.
HHIVE 프로젝트 진행 당시 개발 생산성 향상과 안정적인 서비스 배포를 위하여 CI/CD를 구축하였습니다. GitHub Actions를 활용하여 CI/CD 파이프라인 구축하였고 Docker를 이용한 애플리케이션 컨테이너화하여 독립적인 환경을 만들어 추후 추가적인 개발과정을 겪어도 영향을 받지 않도록 구성했습니다. AWS EC2 내 Docker compose 활용하여 여러 컨테이너로 구성된 서비스를 관리하도록 하였습니다. CI 과정에서 가볍고 빠른 테스트가 가능한 H2를 테스트 환경으로 활용하였고 이후 서버관리에 용이한 MySQL을 운영환경으로 적용했었습니다.
GitHub에 올린 프로젝트 중 하나를 선택해, 기술 스택과 역할을 설명해 주세요.
제가 GitHub에 올린 대표적인 프로젝트로 HHIVE라는 프로젝트가 있습니다. 이 프로젝트는 사용자 위치 기반의 취미 공유 플랫폼으로, 여러 최신 기술 스택을 활용하여 개발했습니다. 1. 기술스택
백엔드:
Spring Boot 3.2.1과 JAVA 17을 사용해 애플리케이션의 주요 비즈니스 로직을 구현했습니다.
Spring Data JPA를 활용해 MySQL과 H2 데이터베이스와의 상호작용을 간편하게 관리했고, Querydsl을 통해 복잡한 쿼리도 효율적으로 작성했습니다.
Spring Security와 **JSON Web Token (JWT)**을 사용해 인증 및 권한 관리를 처리했으며, Spring Validation으로 입력 데이터의 유효성을 검증했습니다.
Spring Web Services와 JavaMailSender를 사용해 RESTful API와 이메일 전송 기능을 구현했습니다.
SseEmitter를 사용해 실시간 알림 기능을 추가했습니다.
Lombok을 통해 코드를 간결하게 유지했습니다.
프론트엔드:
Vue.js를 사용해 사용자 인터페이스를 구현하고, 백엔드와의 통신을 통해 데이터를 처리했습니다.
배포 및 인프라:
GitHub Actions를 사용해 CI/CD 파이프라인을 구축하여 코드 변경 시 자동으로 빌드, 테스트, 배포가 이루어지도록 설정했습니다.
Docker와 Docker Compose를 이용해 애플리케이션을 컨테이너화하고, AWS EC2에서 배포했습니다.
S3를 통해 정적 파일을 호스팅하고, Route53으로 도메인 관리를 수행했습니다.
2. 역할:
백엔드 개발에서는 프로젝트에서 모임을 생성하는 기능과 데이터베이스 설계 및 관리 등을 맡았습니다.
CI/CD 파이프라인 구축에서는 GitHub Actions를 활용해 자동화된 빌드, 배포 프로세스를 설정하여, 팀의 개발 생산성을 높였습니다.
또한, Docker를 사용해 애플리케이션을 컨테이너화하고, 이를 AWS EC2에 배포하여 안정적인 서비스 운영을 가능하게 했습니다.
이 프로젝트에서 저는 백엔드 개발과 CI/CD 파이프라인 구축을 담당하였으며 프로젝트를 통해 다양한 최신 기술 스택을 활용해 실무적인 경험을 쌓을 수 있었고, 팀원들과 협업하면서 프로젝트를 성공적으로 마무리할 수 있었습니다.
HTTP 상태 코드 중 자주 사용하는 코드와 그 의미에 대해 설명해 주세요.
1. 200 OK:
의미: 요청이 성공적으로 처리되었음을 나타냅니다. 서버가 요청된 리소스를 성공적으로 반환하거나, POST 요청을 통해 새로운 리소스가 생성되었을 때 사용됩니다.
사용 예시: 클라이언트가 서버에 데이터를 요청했을 때, 서버가 정상적으로 데이터를 찾아서 클라이언트에 반환할 때 이 코드를 사용합니다.
2. 201 Created:
의미: 요청이 성공적으로 처리되었으며, 새로운 리소스가 생성되었음을 나타냅니다. 이 상태 코드는 주로 POST 요청 이후에 사용됩니다.
사용 예시: 새로운 사용자 계정을 생성한 후, 서버가 클라이언트에게 성공적으로 계정이 만들어졌음을 알릴 때 이 코드를 사용합니다.
3. 400 Bad Request:
의미: 클라이언트의 요청이 잘못되었거나 유효하지 않음을 나타냅니다. 서버는 요청을 이해할 수 없거나 처리할 수 없습니다.
사용 예시: 클라이언트가 잘못된 형식의 데이터를 서버에 보냈을 때, 서버는 이 코드를 반환하여 클라이언트가 요청을 수정하도록 합니다.
4. 401 Unauthorized:
의미: 인증이 필요한 리소스에 대해 클라이언트가 인증되지 않았음을 나타냅니다. 즉, 클라이언트가 올바른 자격 증명을 제공하지 않았음을 의미합니다.
사용 예시: 사용자가 로그인을 하지 않은 상태로 인증이 필요한 페이지에 접근하려고 할 때 이 코드가 반환됩니다.
5. 403 Forbidden:
의미: 클라이언트가 요청한 리소스에 접근할 권한이 없음을 나타냅니다. 클라이언트의 인증 상태와 관계없이, 서버는 요청을 거부합니다.
사용 예시: 인증된 사용자가 관리자 권한이 필요한 페이지에 접근하려고 할 때 이 코드가 반환될 수 있습니다.
6. 404 Not Found:
의미: 클라이언트가 요청한 리소스를 서버에서 찾을 수 없음을 나타냅니다. 서버는 요청된 리소스가 존재하지 않거나, 경로가 잘못되었을 때 이 코드를 반환합니다.
사용 예시: 사용자가 잘못된 URL을 입력하여 존재하지 않는 페이지에 접근하려고 할 때 이 코드가 반환됩니다.
7. 500 Internal Server Error:
의미: 서버에서 예기치 않은 오류가 발생했음을 나타냅니다. 이 상태 코드는 서버가 요청을 처리하는 중에 문제가 발생했을 때 반환됩니다.
사용 예시: 데이터베이스 연결 오류나 서버 코드에서 예외가 발생했을 때 이 코드를 반환할 수 있습니다.
이 외에도 여러 HTTP 상태 코드가 있지만, 위에서 언급한 코드들은 웹 애플리케이션에서 가장 자주 사용되는 기본적인 상태 코드들입니다. 각 상태 코드는 클라이언트와 서버 간의 통신 상태를 명확하게 전달하는 데 중요한 역할을 합니다.
Docker를 활용한 컨테이너화 경험이 있나요? 있다면 설명해 주세요.
HHIVE 프로젝트 당시, 배포 환경의 일관성을 유지하고 추후 확장성과 관리 용이성을 높이기 위해 Docker에 관심을 가졌습니다. 이를 위해 Spring Boot 애플리케이션을 컨테이너화하기 위한 Dockerfile을 작성했습니다. 이후, CI/CD 파이프라인을 구축하기 위해 GitHub Actions를 사용했습니다. 코드가 변경될 때마다 자동으로 애플리케이션이 빌드되고, Docker 이미지를 생성하여 Docker Hub에 푸시한 후, AWS EC2 인스턴스에 배포했습니다.
성능 최적화를 위해 어떤 방법을 사용해보셨나요?
Spring Security를 사용하여 인증과 인가를 구현한 경험이 있나요?
네, Spring Security를 사용하여 인증과 인가를 구현한 경험이 있습니다. 제가 진행했던 SpaghettiCodingClub 프로젝트에서 이를 적용했습니다. 1. 인증(Authentication):
Spring Security와 JWT (JSON Web Token) 기반의 인증 방식을 사용했습니다. 사용자가 로그인하면, Spring Security를 통해 자격 증명(이메일과 비밀번호)을 검증하고, 유효한 사용자인 경우 JWT 토큰을 생성하여 클라이언트에 반환했습니다.
이 JWT 토큰은 이후의 모든 요청 헤더에 포함되며, 서버는 토큰을 검증하여 사용자가 인증된 상태인지 확인했습니다. 이를 통해 서버는 상태를 유지하지 않으면서도, 사용자의 인증 상태를 효율적으로 관리할 수 있었습니다.
2. 인가(Authorization):
Spring Security의 **Role-Based Access Control (RBAC)**을 사용해 사용자 권한을 관리했습니다. 예를 들어, 일반 사용자에게는 ROLE_USER를, 관리 권한이 있는 사용자에게는 ROLE_ADMIN을 부여했습니다.
URL별 접근 제어를 설정하여, 특정 역할만 접근할 수 있는 경로를 명확히 구분했습니다. 예를 들어, /api/auths/withDraw와 같은 요청은 인증된 사용자만 접근할 수 있도록 설정했습니다.
이를 위해 JwtAuthorizationFilter를 구현하여, 모든 요청에 대해 JWT 토큰을 검증하고, 사용자의 권한을 확인한 후 적절한 접근을 허용했습니다.
3. 구현된 기능:
회원가입 및 이메일 인증: 사용자가 회원가입을 하면 이메일로 인증 링크를 발송하고, 이 링크를 통해 이메일 인증을 완료하도록 했습니다. 이메일 인증이 완료된 사용자만 로그인을 할 수 있도록 Spring Security를 통해 추가적인 인증 절차를 구현했습니다.
로그인 처리: JwtAuthenticationFilter를 통해 사용자의 로그인 요청을 처리하고, 인증 성공 시 JWT 토큰을 생성하여 클라이언트에 반환했습니다. 이 과정에서 사용자의 참여 트랙 정보 등도 함께 반환하여, 클라이언트가 필요한 데이터를 한 번에 받을 수 있도록 했습니다.
보안 강화: JWT 토큰의 유효성 검사, 만료 처리, 잘못된 서명 검증 등을 통해 보안을 강화했습니다. 토큰이 만료되었거나 서명이 잘못된 경우, 클라이언트에 적절한 에러 메시지를 반환하도록 했습니다.
이 프로젝트를 통해, Spring Security를 활용한 인증 및 인가 시스템을 설계하고 구현하는 경험을 쌓을 수 있었습니다. 특히, JWT를 사용해 무상태(stateless) 인증 시스템을 구축함으로써, 확장 가능하고 유지보수하기 쉬운 인증 구조를 만들 수 있었습니다.
프로젝트에서 발생한 충돌 상황을 어떻게 해결했는지 설명해 주세요.
학습한 기술 중 실제 프로젝트에 적용해본 사례를 설명해 주세요.
블로그를 운영하면서 가장 기억에 남는 기술 포스트 주제는 무엇인가요?
팀 프로젝트에서 맡았던 역할과 기여도를 설명해 주세요.
Spring Batch를 활용한 경험이 있나요? 있다면 설명해 주세요.
코드 리뷰를 통해 얻은 가장 큰 배움은 무엇인가요?
코드 리뷰를 통해 얻은 가장 큰 배움은 협업의 중요성과 코드 품질 향상입니다. 코드 리뷰는 단순히 코드의 오류를 찾는 과정이 아니라, 팀원들과 소통하며 서로의 생각과 접근 방식을 공유하는 중요한 기회라는 것을 배웠습니다. 다른 개발자의 피드백을 통해 제 코드의 개선점을 발견할 수 있었고, 반대로 제가 제공한 피드백이 팀원의 성장을 도울 수 있다는 점에서 협업의 가치를 깊이 느꼈습니다. 또한 리뷰 과정에서 코드의 가독성을 높이기 위해 변수명과 함수명을 더 명확하게 짓거나, 불필요한 중복 코드를 제거, 놓치기 쉬운 예외 처리나 성능 문제를 발견하고 수정하는 경험을 통해 코드 품질을 향상 시킬수 있었다는것이 가장 큰 배움이었습니다.