24.08.12

윤지현·2024년 8월 12일

TIL

목록 보기
39/75

오늘의 루틴

  • 3 Layer Architecture에 대한 강의 내용 학습 (O)
  • 개인과제 필수조건까지 코드를 작성 (O)
  • 저번에 배운 Spring 복습 (△)

3 Layer Architecture란 무엇일까?

- Controller, Service, Repository 3개로 분리
-------------------------------------------------------
🔻 Controller
   - 클라이언트의 요청 받기
   - Request에 대한 처리는 'Service'에서!
-------------------------------------------------------
🔻 Service
   - 사용자의 요구사항을 처리
   - DB에 저장 or 조회는 'Repository'에서!
-------------------------------------------------------
🔻 Repository
   - DB 관리 (연결, 해제, 자원 관리)
   - CRUD를 처리
-------------------------------------------------------

1. Controller

@RestController
@RequestMapping("/api")
public class MyScheduleServerController {

    private final JdbcTemplate jdbcTemplate;

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

    @PostMapping("/schedules")
    public MyScheduleResponseDto createSchedule(@RequestBody MyScheduleRequestDto myScheduleRequestDto) {
        MyScheduleService myScheduleService = new MyScheduleService(jdbcTemplate);
        return myScheduleService.createSchedule(myScheduleRequestDto);
    }

2. Service

public class MyScheduleService {
    private final JdbcTemplate jdbcTemplate;

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


    public MyScheduleResponseDto createSchedule(MyScheduleRequestDto myScheduleRequestDto) {
        // RequestDto -> Entity
        MySchedule mySchedule = new MySchedule(myScheduleRequestDto);

        // DB 저장
        MyScheduleRepository myScheduleRepository = new MyScheduleRepository(jdbcTemplate);
        MySchedule saveMySchedule = myScheduleRepository.save(mySchedule);

        // Entity -> ResponseDto
        MyScheduleResponseDto myScheduleResponseDto = new MyScheduleResponseDto(mySchedule);

        return myScheduleResponseDto;
    }

3. Repository

public class MyScheduleRepository {
    private final JdbcTemplate jdbcTemplate;

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

    public MySchedule save(MySchedule mySchedule) {
        // DB 저장
        KeyHolder keyHolder = new GeneratedKeyHolder(); // 기본 키를 반환받기 위한 객체

        String sql = "INSERT INTO schedule (task, manager, password, created_day, updated_day) VALUES (?, ?, ?, ?, ?)";
        jdbcTemplate.update(con -> {
                    PreparedStatement preparedStatement = con.prepareStatement(sql,
                            Statement.RETURN_GENERATED_KEYS);

                    preparedStatement.setString(1, mySchedule.getTask());
                    preparedStatement.setString(2, mySchedule.getManager());
                    preparedStatement.setString(3, mySchedule.getPassword());
                    preparedStatement.setTimestamp(4, mySchedule.getCreatedDay());
                    preparedStatement.setTimestamp(5, mySchedule.getUpdatedDay());
                    return preparedStatement;
                },
                keyHolder);

        // DB Insert 후 받아온 기본키 확인
        Long id = keyHolder.getKey().longValue();
        mySchedule.setId(id);

        return mySchedule;
    }
  • 오늘의 후기
    • 전체적으로 코드를 작성하면서 필수 조건들(CRUD) 등을 구현하고 이를 3 Layer Architecture로 역할 분리하였다. 전체적으로 만들었지만 세부적인 부분을 수정해야 할 것 같다.(ex 등록할 때 등록한 내용 출력 등)
profile
첫 시작

0개의 댓글