본문 바로가기
Category/Project

[개인프로젝트] 15일차 - 배열 탐색

by developer__Y 2024. 3. 2.

 

마지막으로 구현할 기능은 정렬 및 탐색 기능이다.

현재 작업하고있는 프로젝트는 구인&구직 서비스로, 

 

구직자는 자신의 이력서에 자신의 특성을 나타내는 해시태그 형태를 등록하고,

채용공고를 올리는 유저는 채용 직무에 맞는 선호하는 특성을 등록한다.

 

<구직자>

<채용공고>

 

그리고, 해당 특성 항목들은 DB 테이블에서 다음과 같이 Personality 테이블의 id값을

참조하여 각각의 Resume, Employment 테이블들의 중간 테이블에서 받아주고있다.

하나의 이력서가 여러개의 특성을 가질수있고, 하나의 특성이 여러개의 이력서를 가질수있다.

또한 하나의 채용공고가 여러개의 특성을 가질수있고, 하나의 특성이 여러개의 특성을 가질수있다.

 

 

Personality 테이블과 Resume, Personality 테이블과 Employ 테이블의 관계가 각각 다대다 관계이기때문에,

각각의 엔티티에서 아래와 같이 정의하여 List<Personality> 타입을 가진다.

 

 

 

문제정의

위와 같은 상황에서,

특정 채용공고가 가지고있는 여러개의 선호특성들과 가장 많이 일치하는 이력서들을 찾아,

일치하는 특성 갯수가 많은 이력서 순으로 정렬하여 사장님에게 보여주는 기능을 구현하려고하였다.

 

DB에서는 독립적인 테이블이 구현되어있지만, JPA에서 List<Personalitys> 타입의 형태로 각각의 엔티티의 컬럼으로 저장되어있기때문에 SQL쿼리문이아닌 Java내에서 배열 탐색&정렬하는 로직을 구현하였다.

 

 

 

즉, 채용공고가 가진 특성 ( = Employment 엔티티의 List<Personality> Personalitys)에서

List에 담긴 Personality 객체들의 id값과 일치하는 갯수가 많은 Resume 객체를 찾아서, 가장 많은 갯수 순으로 List<Resume>를 정렬해야한다.

 

 

Entity -> DTO 변환하기

 

우선, 전체 Resume 리스트를 대상으로 탐색을 해야하기에 성능 최적화를 위하여 최대한 탐색 대상 객체를 가볍게 만들기위해 탐색을 위해 필요한 컬럼만 추려낸 DTO를 만들었다.

 

 

DTO 변환 메소드

 

Service 메소드 만들기

 

찾을 채용공고 Employment 객체를 받아서, List<Resume>으로 리턴하는 findPersonality 메소드

탐색을 위해 엔티티에서 DTO로 변환 및 Personality 객체의 Id값을 List<Long>타입으로 변환

 

배열 탐색

 

 

큰 For문 : 전체 Resume List에서 하나씩 resume을 꺼내 탐색

내부 For문1 : 해당 이력서가 가진 특성객체를 Long타입으로 변환

내부 For문2 : 찾을 특성값 List를 하나씩 contains() 메소드를 통해 비교한뒤, 일치할때마다 count 증가

 

하나의 resume 탐색 이후

count 갯수를 해당 DTO에 추가

하나의 resumt가 가진 특성 List 초기화

 

탐색 마친뒤 DTO의 count값을 내림차순하여 List 정렬

 

 

결과 로그