주노 님의 블로그

20240814 본캠프 23일차 TIL 본문

TIL

20240814 본캠프 23일차 TIL

juno0432 2024. 8. 14. 22:12

본캠프 23일차 내용 간단요약

  • 09:00 ~ 10:00 : 코드카타
  • 10:00 ~ 10:10 : 팀 회의
  • 10:10 ~ 12:00 : 과제 리팩토링
  • 12:00 ~ 13:00 : 점심시간
  • 13:00 ~ 13:30 : 튜터님 피드백
  • 13:30 ~ 18:00 : 피드백 수정 및 구현 
  • 18:00 ~ 19:00 : 저녁시간
  • 19:00 ~ 20:00 : 개인 과제 구현
  • 20:00 ~ 21:00 : TIL작성 

오늘 해야할 일 ✔️ 🔺 ❌

✔️  필수 요구사항 리팩토링

🔺 추가 요구사항 1-7까지 구현해보기!

고쳐서 더 좋은내용으로 바꿀수 있잔항?!

 


코드카타

더보기

옹알이

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이런 문제가 있다

어제 문제 자체를 이해못해서 ㅇㅅㅇ... 이리저리 묻고다녔다

그러는중에 팀원분의 코드를 보게 되었지만

그래서 하루뒤에 풀기로했다

 

양심..!

근데 기억이 또렷하다..!

 

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        for(int i = 0 ; i < babbling.length ; i++)
        {
            if(babbling[i].contains("ayaaya")
               || babbling[i].contains("yeye")
              || babbling[i].contains("woowoo")
              || babbling[i].contains("mama"))
            {continue;}
            else{
                babbling[i] = babbling[i].replace("aya", " ")
                .replace("ye", " ").replace("woo"," ").replace("ma"," ")
                    .replace(" ", "");
            
                if(babbling[i].length()==0) answer++;
            }
        }
        return answer;
    }
}

 

하다가 답이 틀려서 보니 연속된 단어는 나오면 안된다해서 연속된 단어를 버려놨다

또 틀려서 보니

내가 replace로 "" 공백을 반환하고 있었는데, 생각해보니 yayae 같은경우 aya가 제거되고 ye도 제거될 수 있는것

그래서 " " 이렇게 만들고 마지막에 공백을 제거하기로 했다


개인과제

더보기

3단계

다음 조건을 바탕으로 등록된 일정 목록을 전부 조회할 수 있습니다.
수정일 (형식 : YYYY-MM-DD), 담당자명
조건 중 한 가지만을 충족하거나, 둘 다 충족을 하지 않을 수도, 두 가지를 모두 충족할 수도 있습니다. 
수정일 기준 내림차순으로 정렬하여 조회합니다.

 

동적 쿼리를 써야한다는것을 느꼈다

 

https://www.inflearn.com/community/questions/269386/jdbctemplate-%EB%8F%99%EC%A0%81%EC%BF%BC%EB%A6%AC-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4

 

jdbcTemplate 동적쿼리 질문입니다. - 인프런 | 커뮤니티 질문&답변

누구나 함께하는 인프런 커뮤니티. 모르면 묻고, 해답을 찾아보세요.

www.inflearn.com

 

참고자료!

public List<Schedule> findByManagerOrDate(String manager, Timestamp date) {
        StringBuilder query = new StringBuilder("SELECT * FROM schedule WHERE deleteStatus = false");
        List<String> queryArgs = new ArrayList<>();

        if (manager != null)
        {
            query.append(" AND manager = ?");
            queryArgs.add(manager);
        }
        if(date != null)
        {
             query.append(" AND DATE(modDate) = DATE(?)");
            queryArgs.add(date);
            query.append(" ORDER BY modDate DESC");
        }

 이렇게 만들어서

만약 manager이나 date가 있다면 추가하는 방식으로 구현하였다

 

public List<Schedule> findByManagerOrDate(String manager, String date)
    {
        ScheduleRepository scheduleRepository = new ScheduleRepository(jdbcTemplate);
        return scheduleRepository.findByManagerOrDate(manager, date);
        Timestamp timestamp = null;
        if(date!=null)
        {
            date += " 00:00:00";
            timestamp = Timestamp.valueOf(date);
        }
        return scheduleRepository.findByManagerOrDate(manager, timestamp);

 그리고 string으로 받은 date를 timestamp형식으로 변환하기 위해 date에다가 00:00:00을 추가했다

 

4단계

선택한 일정 내용 중 할일, 담당자명 만 수정 가능합니다.
서버에 일정 수정을 요청할 때 비밀번호를 함께 전달합니다.
작성일 은 변경 안되며, 수정일 은 수정 시점으로 변경합니다.
수정된 일정의 정보를 반환 받아 확인할 수 있습니다.

public Long updateSchedule(Long id, String password, ScheduleRequestDto scheduleRequestDto)
    {
        ScheduleRepository scheduleRepository = new ScheduleRepository(jdbcTemplate);
        Schedule schedule = scheduleRepository.findById(id);
        if(schedule!=null && schedule.getPassword().equals(password))
        {
            scheduleRepository.update(id, scheduleRequestDto);
            return id;
        }
        return null;
    }

 password랑 일치하는 내용만 받아온다

 

5단계

선택한 일정을 삭제할 수 있습니다.
서버에 일정 수정을 요청할 때 비밀번호를 함께 전달합니다.

public void delete(Long id)
    {
        String sql = "UPDATE schedule SET deleteStatus = ?, modDate = ? WHERE scheduleId = ?";
        jdbcTemplate.update(sql, true
                , java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()),id);
    }

update문으로 그냥 deleteStatus를 true로 변경한다

 

그리고 튜터님한테 코드리뷰를 받으며 수정한 결과!

 

restful한 설계를 위해서는 get/post/patch만 보고도 어떤 역할인지 알 수 있으니까

url에는 동사를 넣지않는다고 한다 ㅇㅇ.. 그래서 뺐다

그러면서 수정과 삭제는 같은기능을 하기때문에  patch로 둘 수 없고 delete 어노테이션을 하되 레파지토리에는 수정로직으로 바꿨다

 

erd도 LONG > BIGINT로 변경!

 

그리고 조회로직이 너무긴것이 문제!

        return jdbcTemplate.query(sql, resultSet -> {
            List<Schedule> schedules = new ArrayList<>();
            while(resultSet.next()) {
                Schedule schedule = new Schedule();
                schedule.setScheduleId(resultSet.getLong("scheduleId"));
                schedule.setContents(resultSet.getString("contents"));
                schedule.setPassword(resultSet.getString("password"));
                schedule.setManager(resultSet.getString("manager"));
                schedule.setRegDate(Timestamp.valueOf(resultSet.getString("regDate")));
                schedule.setModDate(Timestamp.valueOf(resultSet.getString("modDate")));
                schedule.setDeleteStatus(resultSet.getBoolean("deleteStatus"));
                schedules.add(schedule);
            }
            return schedules;
        }, queryArgs.toArray());

 

이걸 너무 반복하는게 보기싫었다

rowmapper를 사용하면 이런 불필요한 반복이 사라질 수 있다

 

    RowMapper<Schedule> rowMapper = (resultSet, rowNum) ->
    {
        Schedule schedule = new Schedule();
        schedule.setScheduleId(resultSet.getLong("scheduleId"));
        schedule.setContents(resultSet.getString("contents"));
        schedule.setPassword(resultSet.getString("password"));
        schedule.setManagerId(resultSet.getLong("managerId"));
        schedule.setRegDate(Timestamp.valueOf(resultSet.getString("regDate")));
        schedule.setModDate(Timestamp.valueOf(resultSet.getString("modDate")));
        schedule.setDeleteStatus(resultSet.getBoolean("deleteStatus"));
        return schedule;
    };

 

참고자료!

https://montoo.tistory.com/entry/Spring-JdbcTemplate-query-update-RowMapperT

 

Spring) JdbcTemplate ( query( ), update( ), RowMapper<T> )

1. JdbcTemplate이란? 기존 JDBC에서는 DB를 다루려고 할 때, PreparedStatement ResultSet Connection 이 세 가지 객체를 따로 다루며 DB에 접근한다. Connection으로 DB정보를 불러오고, PreparedStatement로 쿼리문에 들어

montoo.tistory.com

 

jdbcTemplate.query(sql, rowMapper, queryArgs.toArray());

이렇게 깔끔하게 줄어들었다!

 

dto로 반환하기

비밀번호를 검증하려면 rowMapper에 password가 필요하고.

password를 반환하지 않기위해서 dto로 반환을 하기로 했다

 public List<Schedule> readScheduleList(@RequestParam(required = false) String manager,
    public List<ScheduleResponseDto> readScheduleList(@RequestParam(required = false) String manager,

 위에서 아래로 수정!

 

 과제6

 과제 6을 만들기위해서 테이블을 수정하였다

 

원래있던 테이블에서 담당자 컬럼을 삭제하고, 새로운 담당자 테이블을 만들어, 담당자를 외래키로 연결해준다

 

참고자료들!

 

https://knitter-amelie.tistory.com/27

 

SQL 제약조건 Constraints - 외래키_Foreign key

외래키 (FOREIGN KEY)는 테이블 사이의 관련성이 파괴되는 것을 막기 위해 사용된다. 다시 말해서 어느 한 테이블의 외래키는 다른 테이블의 기본키가 된다. 외래키 (FOREIGN KEY)는 한 테이블에 필드

knitter-amelie.tistory.com

https://gent.tistory.com/323

 

[Oracle] 오라클 컬럼(Column) 추가, 삭제 방법 (컬럼 순서 변경)

오라클 테이블에 컬럼을 추가하기 위해서는 ALTER TABLE을 사용한다. 컬럼을 추가하면 테이블 컬럼의 마지막 순서에 추가가 되며, 컬럼 순서의 중간에 컬럼을 추가할 수는 없다. 오라클 12c 부터는

gent.tistory.com

 

ALTER TABLE SCHEDULE DROP COLUMN MANAGER

로 매니저 컬럼을 삭제하고

 

create table manager
(
    managerId   bigint auto_increment
        primary key,
    managerName varchar(10)                         not null,
    email       varchar(100)                        not null,
    regDate     timestamp default CURRENT_TIMESTAMP null,
    modDate     timestamp default CURRENT_TIMESTAMP null
);

매니저 테이블을 만들어서

 

FOREIGN KEY (managerId) REFERENCES manager(managerId);

외래키를 만들어준다

 

StringBuilder query = new StringBuilder("SELECT * FROM schedule s join manager m on s.managerId = m.managerId WHERE deleteStatus = false");

 

그리고 담당자를 조회 할 수 있게 join을 해준다.

 

private Manager manager;

 

또 scheduleResponseDto에 manager객체를 넣어준다

 

RowMapper<Schedule> rowMapper = (resultSet, rowNum) ->
    {
        Schedule schedule = new Schedule();
        schedule.setScheduleId(resultSet.getLong("scheduleId"));
        schedule.setContents(resultSet.getString("contents"));
        schedule.setPassword(resultSet.getString("password"));
        schedule.setManagerId(resultSet.getLong("managerId"));
        schedule.setRegDate(Timestamp.valueOf(resultSet.getString("regDate")));
        schedule.setModDate(Timestamp.valueOf(resultSet.getString("modDate")));
        schedule.setDeleteStatus(resultSet.getBoolean("deleteStatus"));

        Manager manager = new Manager();
        manager.setManagerId(resultSet.getLong("managerId"));
        manager.setManagerName(resultSet.getString("managerName"));
        manager.setEmail(resultSet.getString("email"));
        manager.setRegDate(resultSet.getTimestamp("regDate"));
        manager.setModDate(resultSet.getTimestamp("modDate"));

        schedule.setManager(manager);
        return schedule;
    };

 

로우매퍼에도 manager을 받아준다

 


오늘의 회고 & 12시간 몰입했는가? 
휴.. 자료찾아보고 거의 몰입하려고 노력한것같다..!

'TIL' 카테고리의 다른 글

20240816 내배캠 25일차 TIL  (0) 2024.08.17
20240815 본캠프 24일차 TIL  (0) 2024.08.15
20240813 본캠프 22일차 TIL  (0) 2024.08.14
20240812 본캠프 21일차 TIL  (0) 2024.08.12
20240809 본캠프 20일차 TIL  (0) 2024.08.09