개요
우리의 프로젝트는 크게 2개의 줄기로 나눌 수 있을것 같다
- 피사체의 집중도 판별
- 집중도에 대한 레이블의 정보를 데이터베이스에 저장하여 시간 별 집중도 시각화하여 보여주기
두 작업 모두 참여하였지만, 특히 필자는 2번 항목에 대한 역할을 맡아 해당 기능을 구현하는 것을 목표하였다.
피사체의 집중도 판별
우선 '피사체의 집중도 판별'의 계획이다.
step1. 분석 모델 찾기
step2. 데이터 수집
step3. 데이터 레이블
step4. 결과 데이터 가공 및 데이터베이스에 넘기기
와 같은 절차를 거쳐 집중도에 대한 결과 값을 얻어낼 계획이다.
Step1. 분석 모델 찾기
집중도를 검사할 때의 필요한 요소들을 생각해보았다.
- 눈의 깜빡임 빈도
- 목 움직임 빈도
- 표정 분석
를 통해 결과를 통합해 레이블링하려한다.
모델을 찾기에 앞서 여러가지 이미지 분석에 대한 기술과 라이브러리를 알아보았다!!
우선 우리 프로젝트는 주로 이미지와 영상을 다루는 기술이 필요하므로 Convolutional neural network(CNN 또는 ConvNet)을 활용해야할 것이다.
CNN란 데이터로부터 직접 학습하는 딥러닝의 신경망 아키텍처로, 영상에서 객체, 클래스, 범주 인식을 위한 패턴을 찾을 때 특히 유용하고, 오디오, 시계열 및 신호 데이터를 분류하는 데도 매우 효과적이라고 한다..흠흠
Step2. 데이터 수집
주로 노트북을 통해 동영상 강의를 볼 테니까,,
노트북 카메라를 통해 몇 개의 영상과 사진 데이터를 만들어보았다!
(졸렵고 공부하기 싫은 마음을 온통담아)
영상과 사진을 찍었다.
데이터를 만들면서 느낀 점은,
사용자마다 졸릴 때 행동 특성이 모두 다르기 때문에, 왼손잡이인지 혹은 오른손잡이인지 사전정보를 요구하거나,
우리의 서비스를 사용하면서 집중도의 판별이 어려운 데이터의 경우, 사용자가 직접 레이블링을 하는 방법도 넣으면 좋을것 같다는 생각을 했다.
구현이 관건이긴 하지만, 열심히 공부하다보면 집중도에 대한 정확도가 높아지지 않을까?
Step3&4. 데이터 레이블링, 결과 가공 및 데이터 베이스에 넘기기
아직 이 과정은 다른 팀원이 열심히 진행 중에 있다!!
결과가 잘 나왔으면 좋겠다.
나온 결과를 담을 데이터베이스는 MySQL을 사용하기로 했다.
어쨌든 넘어올 데이터의 필드 자체는 유동적이지 않아서, 충분히 RDB로 구현할 수 있을 것이라 생각했고, 또한 ERD설계만 잘 한다면 가장 개발할 때 직관적일 것 같다.
Spring boot에 MySQL연동하기
무튼무튼!
딴 팀원이 모델을 열심히 돌리는 동안,
나는 Spring boot에 MySQL을 연동해 데이터 관리를 해볼 것이다.
파일구조
파일의 기능을 하나씩 말하기는 사족이 길것같으니 패키지별로 살펴보자면,
- controller : 클라이언트로부터 요청을 받고 그에 따른 응답을 반환하는 역할을 한다. 여기에서는 회원가입 시 데이터베이스에 추출해 반환한다.
- DTO (Data Transfer Object) : 데이터 전송 객체로 컨트롤러와 서비스 사이에서 데이터를 전달하는 데 사용한다.
- Entity : 데이터베이스에서 사용되는 객체로 실제 데이터베이스 테이블과 매핑된다.
- JPA를 사용해 객체-관계 매핑을 지원한다.
- Repository : 데이터베이스와의 상호작용을 담당하며 CRUD를 가능케 한다. JPA를 통해 복잡한 쿼리문 없기 간단히 구현가능하다.
글로 보니 복잡하고 어렵다..
위의 내용은 그렇구나.. 하고 읽어보고 코드로 보는것이 훨씬 효과적이겠다!!!!
여러 글들을 참고하여 코드를 구성해보았는데 주석을 달아놓았으니 하나씩 보면서 구현하고 공부해보자.
HomeController.class
// HomeController.class
package ECST.recognizedConcentration.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
// <http://localhost:8080/로> 로컬 실행할때 index.html을 띄운다.
@GetMapping("/")
public String index() {
return "index";
}
}
UserController.class
// UserController.class
package ECST.recognizedConcentration.controller;
import ECST.recognizedConcentration.dto.UserDTO;
import ECST.recognizedConcentration.entity.User;
import ECST.recognizedConcentration.repository.UserRepository;
import ECST.recognizedConcentration.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequiredArgsConstructor // userSErvice 대한 멤버를 사용가능
public class UserController {
// injecting constrator
private final UserService userService;
// 회원가입 페이지 출력 요청
@GetMapping("/user/signup")
public String signupForm() {
return "signup";
}
@PostMapping("/user/signup") // name값을 requestparam에 담아온다
public String signup(
@ModelAttribute UserDTO userDTO
// @RequestParam("userName") String userName,
// @RequestParam("password") String password,
// @RequestParam("age") String age
// 하나의 코드로 주석처리한 모든 요소들을 관통할 수 있다! 이것이 바로 DTO의 기능이다.
) {
System.out.println("UserController.save");
System.out.println("userDTO = " + userDTO);
userService.signup(userDTO);
return "index";
}
}
UserDTO.class
// UserDTO.class
package ECST.recognizedConcentration.dto;
import ECST.recognizedConcentration.entity.User;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
//lombok dependency추가
@Getter
@Setter
@NoArgsConstructor
@ToString
public class UserDTO { //회원 정보를 필드로 정의
private Long id;
private String password;
private String userName;
//lombok 어노테이션으로 getter,setter,생성자,toString 메서드 생략 가능
public static UserDTO toUserDTO(User userEntity){
UserDTO userDTO = new UserDTO();
userDTO.setId(userEntity.getId());
userDTO.setUserName(userEntity.getUserName());
userDTO.setPassword(userEntity.getPassword());
return userDTO;
}
}
User.class
//User.class
package ECST.recognizedConcentration.entity;
import ECST.recognizedConcentration.dto.UserDTO;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
@Entity
@Table(name = "user_table") // 사용하지 않으면 클래스 이름이 테이블 이름이 됨
@Getter // lombok getter
@Setter // lombok setter
public class User {
// 기본키를 의미. 반드시 기본키를 가져야 함.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 비밀번호
@NonNull
@Column(name="pass_word")
private String password;
// 사용자 이름
@NonNull
@Column(unique = true, length = 10, name = "user_name") // 유일하고 최대 길이가 10
private String userName;
// 사용자 나이
@Column(name="person_age")
private int age;
public static User toUserEntity(UserDTO userDTO){
User userEntity = new User();
userEntity.setId(userDTO.getId());
userEntity.setUserName(userDTO.getUserName());
userEntity.setPassword(userDTO.getPassword());
return userEntity;
}
}
UserRepository.interface
// UserRepository.interface
package ECST.recognizedConcentration.repository;
import ECST.recognizedConcentration.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
UserService.class
// UserService.class
package ECST.recognizedConcentration.service;
import ECST.recognizedConcentration.dto.UserDTO;
import ECST.recognizedConcentration.entity.User;
import ECST.recognizedConcentration.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service // 스프링이 관리해주는 객체를 나타낸다.
@RequiredArgsConstructor // controller와 같이, create final member constructor
public class UserService {
private final UserRepository userRepository; // 먼저 jpa, mysql dependency 추가
public void signup(UserDTO userDTO) {
// repsitory의 save 메서드 호출
User userEntity = User.toUserEntity(userDTO);
userRepository.save(userEntity);
//Repository의 save메서드 호출 (조건. entity객체를 넘겨줘야 함)
}
}
index.html
// index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<h1> Index Page!</h1>
<a href="/user/signup">회원가입</a>
<a href="/user/signin">로그인</a>
</body>
</html>
signup.html
//signup.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Save</title>
</head>
<body>
<!-- action : form에 작성한 데이터를 어디로 보낼지 지정 -->
<form action="/user/signup" method="post">
<!-- name : 서버로 전송 할 때 변수이름의 역할 -->
NAME: <input type="text" name="userName"> <br>
PASSWORD: <input type="password" name="password"> <br>
AGE: <input type="text" name="age"> <br>
<input type="submit" value="회원가입">
</form>
</body>
</html>
위의 코드를 실행해보면
이렇게 테이블이 정상적으로 생성된걸 확인할 수 있고,
이와같이 MySQL Workbench에 테이블이 정상적으로 생성된 것을 확인할 수 있다!!!
화면 단에서 여러 정보를 입력하고 제출을하면 이 테이블에 column이 하나씩 생기게 될 것이다 ㅎㅎ
안타깝게도 현재는 어느 부분에 에러가 있는지 갑자기 들어갔던 데이터가 제대로 삽입되지 않아 약간의 수정이 필요한 상황이다.
이후, RestfulAPI 엔트포인트 연결도 필요하다 이러한 일련의 과정을 거치면, 모델의 결과 값을 성공적으로 데이터베이스에 저장하고 기능을 구현할 수 있을 것이다!!
'JAVA 당' 카테고리의 다른 글
[eclipse 에러 해결] java.lang.UnsupportedClassVersionError: * has been compiled by a more recent version of the Java Runtime (0) | 2025.03.12 |
---|---|
Spring boot에서 테스트코드 만들고 실행하는 법 (w. intellij) (1) | 2024.01.27 |
그래프정리 및 구현 (0) | 2023.07.24 |
[JAVA] 열받는 자바문법 : Scanner, BufferedReader (0) | 2023.06.21 |
[JAVA] BigInteger 함수 정리 (0) | 2023.06.14 |