- 선호 이미지 기반 추천 시스템을 바탕으로 한 소개팅 웹 서비스입니다.
- 인공지능사관학교 4기 Spring 특화반, 심쿵 조의 Spring 프로젝트입니다.
- 매칭된 회원을 조회할 수 있습니다.
- 받은 좋아요를 확인할 수 있습니다.
- 보낸 좋아요를 확인할 수 있습니다.
- 카드를 클릭하여 원하는 회원을 더 상세하게 조회할 수 있습니다.
- 서로 좋아요를 누르면 매칭이 이루어집니다.
- 매칭이 이루어진 유저끼리 실시간 채팅을 할 수 있습니다.
- 읽지 않은 메시지 수 만큼 알림 기능이 있습니다.
Spring Boot / Maven / JSP / Cassandra / AWS Keyspace / AWS S3 / Spring WebSocket / Spring Security
- Spring Boot, Maven, JSP로 개발하였습니다.
- 선호 이미지 백터를 빠르게 계산하기 위해, Cassandra 데이터 베이스를 사용하였습니다.
- Spring WebSocket을 사용하여 실시간 채팅을 구현하였습니다.
- Spring Security를 사용하여 인증 기능을 구현하였습니다.
- AWS 서비스인 Keyspace를 사용하여 팀원이 공통적으로 개발하기 편한 환경을 조성하였습니다.
- 총 8개의 테이블을 살계하였습니다.
- Keyspace와 통신하고 싶을 때, 매번 DriverConfigLoader를 불러오고, CQL 문법을 사용하는 것을 단순화하기 위해 기본 함수를 구현하였습니다.
- save, findAll, findAllByColumnValue, updateByColumnValues 등의 함수를 구현하였습니다.
public interface DBService {
public DriverConfigLoader getConnection();
<T> void save(DriverConfigLoader loader, Class<T> entityClass, T entity);
public <T> List<T> findAll(DriverConfigLoader loader, Class<T> classType);
<T> List<T> findAllByColumnValue(DriverConfigLoader loader, Class<T> classType, String columnName, Object value);
<T> List<T> findAllByColumnValues(DriverConfigLoader loader, Class<T> classType,
Map<String, Object> columnValues);
<T> void updateByColumnValues(DriverConfigLoader loader, Class<T> classType,
Map<String, Object> updateValues, Map<String, Object> whereConditions);
public <T> void setFieldValue(Field field, T entity, Row row) throws IllegalAccessException;
}
- 여기서, save 함수를 확인해보면, 다음과 같이 구현되어있습니다.
- 제네릭 함수를 통해 member keyspace에 존재하는 테이블 전부에 적용 가능하게끔 구현하였습니다.
@Override
public <T> void save(DriverConfigLoader loader, Class<T> entityClass, T entity) {
System.out.println("[DBServiceImpl][save]");
TableColumnsValues.Result<T> result = TableColumnsValues.extractData(entityClass, entity);
CqlSession session = CassandraSessionManager.getSession(loader);
try {
String columns = String.join(", ", result.columnNames);
String placeholders = String.join(", ", Collections.nCopies(result.columnNames.length, "?"));
String cql = String.format("INSERT INTO %s (%s) VALUES (%s)", "member."+result.tableName, columns, placeholders);
System.out.println("[cql:]" + cql);
PreparedStatement preparedStatement = session.prepare(cql);
Object[] boundValues = convertToAppropriateType(result.values);
session.execute(preparedStatement.bind(boundValues));
} catch (Exception e) {
System.out.println("save Error: " + e);
}
}
- 채팅 탭을 클릭하면 자동으로 웹소켓(ws://localhost:8081)로 접속합니다.
- MessageMapping과 SendTo 어노테이션을 사용하여 자바 코드에서 웹소켓으로 실시간 채팅 기능을 구현하였습니다.
@Controller
public class GreetingController {
@Autowired
ChatService chatService;
/*
* "/app/hello" : 클라이언트 -> 서버 메시지 받음.
* "/topic/greetings" : 서버 -> 구독하는 모든 클라이언트에게 전송.
*/
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public ChattingNotification greeting(Chatting chatting) throws Exception {
chatService.insertChatting(chatting);
ChattingNotification chattingNotification = chatService.getChattingNotification(chatting);
Thread.sleep(1000);
return chattingNotification;
}
@MessageMapping("/typing")
@SendTo("/topic/typingStatus")
public TypingNotification sendTypingStatus(TypingNotification notification) {
return notification;
}
}
이름 | 역할 | 담당 업무 |
---|---|---|
전준 | 팀장 | 인공지능 개발, 선호 이미지 기반 추천 인공지능 기능 개발 |
변지협 | 백엔드 기능 개발 | Cassandra 테이블 설계, 채팅, 다른 회원 조회, 추천 시스템 기능 개발 |
서보경 | 백엔드 기능 개발 | 회원가입 및 로그인 프로필 수정 기능, s3 업로드 기능 개발 |
오주현 | 프론트엔드 기능 개발 | 회원가입 및 프로필, 좋아요 프론트엔드 기능 개발 |
김미소 | 인공지능 개발 | 선호 이미지 기반 추천 인공지능 기능 개발 |