일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 유클리드호제법
- stringbuilder의 reverse()
- 모던자바
- string과 stringbuilder
- addDoc
- 스프링
- git 컨벤션
- 자바 최소공배수
- while과 two-pointer
- 베주계수
- 자바 유클리드
- StringBuilder
- string
- isuppercase()
- 자바 최대공약수
- sql 데이터형 변환
- 동일성과 동등성
- islowercase()
- 최소공배수
- 최대공약수
- toLowerCase()
- 프로그래머스 레벨1
- replaceAll()
- 스프링뼈대
- 스프링환경설정
- Git사용법
- 자바 스트링
- ineer join
- 래퍼타입
- 최대공약수와 최소공배수
- Today
- Total
주노 님의 블로그
20240814 본캠프 23일차 TIL 본문
본캠프 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까지 구현해보기!
고쳐서 더 좋은내용으로 바꿀수 있잔항?!
코드카타
이런 문제가 있다
어제 문제 자체를 이해못해서 ㅇㅅㅇ... 이리저리 묻고다녔다
그러는중에 팀원분의 코드를 보게 되었지만
그래서 하루뒤에 풀기로했다
양심..!
근데 기억이 또렷하다..!
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), 담당자명
조건 중 한 가지만을 충족하거나, 둘 다 충족을 하지 않을 수도, 두 가지를 모두 충족할 수도 있습니다.
수정일 기준 내림차순으로 정렬하여 조회합니다.
동적 쿼리를 써야한다는것을 느꼈다
참고자료!
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
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
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 |