24.08.13

윤지현·2024년 8월 13일

TIL

목록 보기
40/75

오늘의 루틴

  • API 명세서 작성 (O)
  • 개인과제 추가 구현 6번째 코드 작성 (O)
  • Spring 내용 복습 (O)

처음에는 이 내용을 보고 뇌정지가 온 것 같다.
(어떻게 시작해야 하나 계속 생각 중)

6단계 기능: 연관 관계 설정
-------------------------------------------------------
🔻 설명
   - 담당자는 일정과 분리해서 관리합니다. 
   - 동명이인의 담당자가 있어 각 담당자가 할 일을 구별할 수 없습니다! 
	 담당자를 식별하기 위해 이름으로만 관리하던 담당자에게 고유 식별자를 부여합니다.
-------------------------------------------------------
🔻 조건
   - 담당자는 이름 외에 이메일, 등록일, 수정일 정보를 가지고 있습니다.
       - 담당자의 정보는 추가로 받을 수 있습니다.
   - 고유 식별자를 통해 담당자를 조회할 수 있도록 기존 코드를 변경합니다.
-------------------------------------------------------

일단 담당자과 일정과 분리해서 관리한다고 하니 manager라는 table을 생성하였다.

CREATE TABLE IF NOT EXISTS manager (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL UNIQUE,
  email VARCHAR(255) NOT NULL UNIQUE,
  created_day TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_day TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

또한 manager를 연결하면서 그 안에있는 데이터를 가져오려면 기존에 있던 java 코드를 수정해야했다.

1. Service

    public MyScheduleResponseDto createSchedule(MyScheduleRequestDto myScheduleRequestDto) {
        MySchedule mySchedule = new MySchedule(myScheduleRequestDto);

        MyScheduleRepository myScheduleRepository = new MyScheduleRepository(jdbcTemplate);
        MySchedule saveMySchedule = myScheduleRepository.save(mySchedule);

        ManagerRepository managerRepository = new ManagerRepository(jdbcTemplate);
        String managerName = managerRepository.findManagerNameById(saveMySchedule.getManagerId());

        return new MyScheduleResponseDto(saveMySchedule, managerName);
    }

2. Repository

public MySchedule save(MySchedule mySchedule) {
        KeyHolder keyHolder = new GeneratedKeyHolder();
        String sql = "INSERT INTO schedule (task, manager_id, password, created_day, updated_day) VALUES (?, ?, ?, ?, ?)";
        jdbcTemplate.update(con -> {
            PreparedStatement preparedStatement = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            preparedStatement.setString(1, mySchedule.getTask());
            preparedStatement.setLong(2, mySchedule.getManagerId()); // 올바른 manager_id 설정
            preparedStatement.setString(3, mySchedule.getPassword());
            preparedStatement.setTimestamp(4, mySchedule.getCreatedDay());
            preparedStatement.setTimestamp(5, mySchedule.getUpdatedDay());
            return preparedStatement;
        }, keyHolder);

        Long id = keyHolder.getKey().longValue();
        mySchedule.setId(id);
        return mySchedule;
    }
  1. MyScheduleResponseDto
@Getter
@NoArgsConstructor
public class MyScheduleResponseDto {
    private Long id;
    private String task;
    private Long managerId;
    private String managerName;
    private Timestamp createdDay;
    private Timestamp updatedDay;

    public MyScheduleResponseDto(Long id, String task, Long managerId, String managerName, Timestamp createdDay, Timestamp updatedDay) {
        this.id = id;
        this.task = task;
        this.managerId = managerId;
        this.managerName = managerName;
        this.createdDay = createdDay;
        this.updatedDay = updatedDay;
    }

    public MyScheduleResponseDto(MySchedule mySchedule, String managerName) {
        this.id = mySchedule.getId();
        this.task = mySchedule.getTask();
        this.managerId = mySchedule.getManagerId();
        this.managerName = managerName;
        this.createdDay = mySchedule.getCreatedDay();
        this.updatedDay = mySchedule.getUpdatedDay();
    }
}
  1. MyScheduleRequestDto
@Getter
@Setter
@NoArgsConstructor
public class MyScheduleRequestDto {
    private String task;
    private Long managerId;
    private String password;

    public MyScheduleRequestDto(String task, Long managerId, String password) {
        this.task = task;
        this.managerId = managerId;
        this.password = password;
    }
}

근데도 실행했는데 안됬다....

왜? 라고 생각했는데 manager에 데이터를 추가한 다음에 schedule에 데이터를 추가해야 해결할 수 있었다.
이유 : schedule에 있는 manager_id가 manager에 있는 id를 참조하기 때문

그래서 manager를 CRUD할 ManagerController, ManagerRepository를 생성

1. ManagerController

@RestController
@RequestMapping("/api/managers")
public class ManagerController {
    private final ManagerRepository managerRepository;

    public ManagerController(ManagerRepository managerRepository) {
        this.managerRepository = managerRepository;
    }

    @PostMapping
    public void createManager(@RequestBody Manager manager) {
        manager.setCreatedDay(new Timestamp(System.currentTimeMillis()));
        manager.setUpdatedDay(new Timestamp(System.currentTimeMillis()));
        managerRepository.save(manager);
    }
}

2. ManagerRepository

@Repository
public class ManagerRepository {
    private final JdbcTemplate jdbcTemplate;

    public ManagerRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void save(Manager manager) {
        String sql = "INSERT INTO manager (name, email, created_day, updated_day) VALUES (?, ?, ?, ?)";
        jdbcTemplate.update(sql, manager.getName(), manager.getEmail(), manager.getCreatedDay(), manager.getUpdatedDay());
    }

    // 관리자 이름을 ID로 조회
    public String findManagerNameById(Long managerId) {
        String sql = "SELECT name FROM manager WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{managerId}, String.class);
    }

위의 예시코드들을 해서 하니 성공했다!

  • 오늘의 후기
    • 추가 구현에서 6단계를 하는데 이게 맞는지도 모르겠다. 솔직히 막 코드를 작성한 것이어서 내일 다시 확인해야겠다.
      API 명세서도 수정해야겠다.
profile
첫 시작

0개의 댓글