본문 바로가기

분류 전체보기502

9. 개선사항(비즈니스 로직 제거, Exception Handler 적용, DataIntegrityViolationException 처리 방법) 0. 개요 - 우연한 기회로 SI 업체에 면접을 보러 가게 되었다. - 많은 기대는 하지 않았지만, 기대 이상으로 면접 경험이 좋았다. - 문답 형식의 이론 질문이 없었고 코드를 보여주고 해당 코드를 분석하는 방식의 면접이었다. - 확실히 다른 사람이 작성한 코드에서 그 맥락을 모른 체 문제점을 파악한다는 것은 아직은 쉽지 않다. - 면접에서 내가 작성한 사이(SAI)의 코드를 보면서 RestAPI, Java, Spring에 관련된 질문을 받았다. - 그 과정에서 몇 가지 프로젝트의 개선사항을 듣게 되었고 하나씩 개선해보았다. 1. 비즈니스 로직은 Service에서 처리하자. a) 고민은 개선의 시작 - 사실 SAI를 만들면서 방법론적인 고민을 많이 했다. - 그중 하나가 비즈니스 로직의 기준에 대한 고.. 2022. 9. 12.
8. 백엔드 개발 완료(OpenAPI 소개 및 문제해결 회고록) 0. 개요 - 포트폴리오를 개발하는데 매진하여 그동안 블로그를 신경 쓰지 않았다. - 백엔드 개발이 어느 정도 완성되었다. 그래서 이번 포스팅에서는 그동안의 결과물(OpenAPI)을 소개하고 개발 과정에서 겪었던 문제점과 해결방법에 대해 소개해보려 한다. 1. 프로젝트 구조(Structure) - 6월부터 SAI를 개발하고 있다. - 프런트와 연동 작업을 진행하면서 메서드가 추가될 수는 있으나, 전체적인 구조적 측면에서는 변동이 없으므로 현재 시점에서 SAI의 백엔드 구조를 소개한다. ├─ projectSAI/sai-backend/src ├── SaiBackendApplication.java ├── api │ ├── EventApiController.java │ ├── FriendApiController.. 2022. 9. 6.
7. 오류 해결 스토리 - constraint ["PUBLIC.UK_MBMCQELTY0"] 0. 문제 설명 a) 오류 소개 - Entity에 새로운 속성을 부여하기 위해서 코드 수정을 진행하고 있었다. - 새로운 속성을 이용한 쿼리를 테스트하는 과정에서 다음 오류가 발생했다. org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["PUBLIC.UK_MBMCQELTY0FBRVXP1Q58DN57T_INDEX_8 ON PUBLIC.MEMBER(EMAIL) VALUES 5"; SQL statement: insert into member (email, member_name, password, sign_up_date, visibility, member_id) val.. 2022. 7. 30.
6. 오류 해결 스토리 - Update/delete queries cannot be typed 0. 문제 설명 a) JPQL을 이용한 Update 쿼리 작성 - 회원 정보를 수정하기 위해서 다음과 같은 쿼리문을 작성했다. public int updateById(Long id, String name, String email, String password) { return em.createQuery("update Member as m " + "set m.name = :name, m.email = :email, m.password = :password where m.id = :id", Member.class) .setParameter("id", id) .setParameter("name", name) .setParameter("email", email) .setParameter("password", p.. 2022. 7. 30.
5. 오류 해결 스토리 - Join Table 접근과 영속 상태 0. 개요 - 프로젝트 사이의 백엔드를 개발하면서 겪은 다양한 문제의 발생 과정과 해결책을 찾아가는 사고 과정을 기록합니다. 1. 문제 설명 a) Entity 관계 - 프로젝트 사이는 3개의 Entity(Member, Event, Friend)로 구성된다. - Event와 Friend는 모두 Member_id를 외래 키로 사용한다. - 즉, Member를 기준으로 Event와 Friend 객체가 DB에 등록된다. - Event는 다수의 Friend 객체를 보유할 수 있고, Friend는 다수의 Event에 소속될 수 있다. - Event와 Friend는 ManyToMany의 관계를 가지며, 이는 Join Table 전략으로 관리한다. @Entity @Getter public class Event { @I.. 2022. 7. 27.
최단거리 개념 및 문제 접근 방법 0. 개요 - 최단 거리 알고리즘은 그래프 탐색 알고리즘 중 하나이다. - 최단 거리 알고리즘의 종류와 개념 그리고 문제 접근 방법에 대해서 알아보자. 1. 최단 거리 개념과 종류 a) 최단 거리의 의미 - 최단 거리 문제에서 최단 거리는 다음 2가지 경우 중 하나에 해당한다. → 지나온 간선(edge)의 개수가 가장 적은 경로를 찾는 경우 (가중치가 없는 그래프) → 지나온 간선(edge)의 가중치(weight) 합이 가장 작은 경로를 찾는 경우 (가중치가 있는 그래프) b) 최단 거리의 종류 - 최단 거리 문제는 기본적으로 시작점과 도착점이 주어진다. - 시작점과 도착점을 기준으로 최단 경로(간선의 개수 또는 간선 가중치의 합)를 구하는 것이 문제의 핵심이다. - 시작점과 도착점의 구성 방식에 따라서.. 2022. 7. 18.
DFS/BFS 개념 및 문제 접근 방법 0. 개요 - DFS와 BFS는 대표적인 그래프 탐색 알고리즘이다. - DFS와 BFS가 어떻게 다른지, 언제 사용되는지 알아보자. 1. DFS(Depth First Search) a) DFS의 탐색 방법 - DFS는 다음과 같은 탐색 순서를 갖는다. - DFS는 하나의 방향을 결정하면 그 방향을 따라 끝까지 도달한다. ▶ 트리의 경우, 왼쪽에 위치한 노드를 우선적으로 탐색한다. ▶ 그래프의 경우, 가중치 또는 특정 기준을 따라 탐색 방향의 우선순위를 결정한다. - 위의 그림을 토대로 DFS는 다음과 같은 탐색 순서를 갖는다. ▶ 0번을 시작으로 왼쪽에 위치한 노드를 우선적으로 탐색한다. (0 ~ 3번 노드로 탐색) ▶ 3번 노드가 끝이므로 이전 단계로 돌아간다. (1번 노드로 돌아감) ▶ 1번 노드에서.. 2022. 7. 5.
4. DB 구조 설계 - ERD 0. 개요 - 프론트 개발을 어느정도 완료하고 이제 백엔드 개발을 준비하고 있다. - 백엔드 개발의 시작을 ERD 제작으로 선정하여 ERD를 그려보았다. - ERD를 작성해보니 백엔드를 개발하면서 풀어야하는 문제점을 몇가지 발견하였다. 1. Entity 소개 - 프로젝트 SAI는 다음과 같은 Entity로 구성된다. a) User Table - User는 SAI 서비스에 가입한 회원의 정보를 관리하는 테이블이다. - 회원 가입 시 작성한 정보가 User Table에 입력된다. - User Table의 구성은 다음과 같다. id(PK) - 자동 증감을 사용한다. email - 로그인 시 사용할 이메일 주소 / 필수 값 / 유효성 검증 필요 password - 로그인 시 사용할 비밀번호 / 필수 값 / 유효.. 2022. 6. 29.
DP(동적 계획법) 개념 및 문제 접근 방식 0. 개요 - DP(동적 계획법)은 어떤 공식이나 특정 형태가 아닌 방법론에 가까운 개념으로써의 알고리즘이다. - 그래서 이론적으로 DP를 이해하기는 쉽지만, 문제에 적용하기가 쉽지 않다. - 필자가 그랬기에, DP 개념과 문제 접근 방식을 이해하기 쉽게 설명해보려 한다. 1. DP(동적 계획법)란? - DP에 대해 검색해보면 다음과 같은 대표적인 표현이 등장한다. → "하나의 큰 문제를 작은 문제로 나누고, 그 작은 문제를 해결하여 큰 문제의 답을 도출해내는 기법" → "작은 문제를 해결하는 과정에서 중복되는 연산을 수행하지 않는 기법" - 도대체 이게 무슨 말일까? - 피보나치 문제를 예시로 DP의 특징과 문제 접근 방식에 대해 알아보자. 2. DP 문제 접근 방식 - 피보나치 문제를 이용하여 DP .. 2022. 6. 20.