코트카타
41) 이상한 문자 만들기
나의 풀이
class Solution {
public String solution(String s) {
String answer = "";
String[] splitStr = s.split(" ", -1);
StringBuilder result = new StringBuilder();
for (int i = 0; i < splitStr.length; i++) {
String str = splitStr[i];
StringBuilder builder = new StringBuilder();
for (int j = 0; j < str.length(); j++) {
char c = str.charAt(j);
builder.append((j % 2 == 0) ? Character.toUpperCase(c) : Character.toLowerCase(c));
}
result.append(builder);
if (i < splitStr.length - 1) {
result.append(" ");
}
}
answer = result.toString();
return answer;
}
}
다른 분들의 풀이
class Solution {
public String solution(String s) {
String answer = "";
int cnt = 0;
String[] array = s.split("");
for(String ss : array) {
cnt = ss.contains(" ") ? 0 : cnt + 1;
answer += cnt%2 == 0 ? ss.toLowerCase() : ss.toUpperCase();
}
return answer;
}
}
출처:https://school.programmers.co.kr/learn/courses/30/lessons/12930/solution_groups?language=java
2025.02.10(월)
도전
Lv 6. 비밀번호 암호화
로그인 시 입력한 비밀번호와 암호화된 비밀번호 비교 방법
회원 가입 시 비밀번호를 암호화하는 방법은 아래와 같이 진행했다.
@PostMapping("/signup")
public ResponseEntity<SingUpResponseDto> save(@Valid @RequestBody SignUpRequestDto requestDto){
String encyptPassword = passwordEncoder.encode(requestDto.getPassword()); //비밀번호 암호화
SingUpResponseDto singUpResponseDto
= memberService.save(requestDto.getName(),requestDto.getEmail(),encyptPassword);
return new ResponseEntity<>(singUpResponseDto, HttpStatus.CREATED);
}
그러나 이후 로그인 시 입력한 비밀번호와 암호화된 비밀번호를 어떻게 비교하면 좋을지에 대해 고민이 들기 시작했다.
처음에는 같은 비밀번호를 암호화하면 같은 암호화된 값이 나오는 줄 알고 아래와 같이 진행했었다.
그러나 생각대로 되지 않아, 로그로 확인해보니 DB에 저장된 암호화된 비밀번호와 다른 것을 발견할 수 있었다.
String encyptPassword = passwordEncoder.encode(requestDto.getPassword()); //비밀번호 암호화
log.info(encyptPassword);
그렇다면 전처럼 equals와 같은 방법으로 비교할 수는 없을 것이다.
다른 방법은 뭐가 있을까? 바로 matches 메서드를 사용했다.
email(아이디)로 멤버 조회 -> 만약 멤버가 null이면 401 에러 처리
-> 멤버 DB password와 입력한 비밀번호가 같은지 비교(matches)
-> 만약 같으면 email과 암호화된 DB password로 로그인 멤버 조회
-> 만약 같지 않으면 401 에러 처리
@PostMapping("/login")
public ResponseEntity<String> login(@Valid @RequestBody LoginRequestDto requestDto, HttpServletRequest request){
Member member= authService.findByEmail(requestDto.getEmail());
if (member == null){
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
}
String encyptPassword = member.getPassword();
if (passwordEncoder.matches(requestDto.getPassword(),encyptPassword)){
Member loginMember = authService.login(requestDto.getEmail(), encyptPassword);
//로그인 성공 처리
//세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성
HttpSession session = request.getSession();
//세션에 로그인 회원 정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
return new ResponseEntity<>(HttpStatus.OK);
}else {
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
}
}
Lv 7. 댓글 CRUD
일정 id에 해당하는 댓글 조회 기능 구현
댓글과 일정은 연관관계를 가진다.
sql에 익숙한 나로서는 join과 같은 sql문을 작성하지 않고도
댓글 테이블에서 일정 테이블 id로 조회하는 것을 찾기가 쉽지 않았다.
List<Comment> commentList = commentRepository.findAllBySchedule_Id(schedule.getId());
하지만 JPA 메서드를 찾아보니 위와 같은 기능을 발견할 수 있었다.
간단한 쿼리를 메서드를 찾아보면 된다고 튜터님께서 말씀하셨는데
정말 그런 것 같다.
사실 레벨 8까지 진도는 모두 나갔지만
아직 튜터님의 확인을 받지 못했기 때문에
내가 놓친 조건이 있을 수도 있고, 잘못 구상한 부분도 있을 수도 있다.
그래서 내일 오전 중에 튜터님께 문의 드릴 예정이다.
오늘 하루도 스스로에게 고생 많았다는 말을 해주고 싶다.
'CODING > 스파르타 내일배움캠프 TIL' 카테고리의 다른 글
41_크기가 작은 부분 문자열_일정관리 Develop 주석 작성(Javadoc) 및 리팩토링_25.2.12(수) (0) | 2025.02.12 |
---|---|
40_삼총사_JPA, 연관관계 실시간 구현 세션_일정관리 Develop 리팩토링_25.2.11(화) (0) | 2025.02.11 |
38_3진법 뒤집기_일정관리 Develop 개인과제 Lv 2,3,4 필수과제 구현완료_25.2.7(금) (0) | 2025.02.07 |
37_최대공약수와 최소공배수_일정관리 개인과제 피드백_일정관리 Develop 개인과제 Lv 1, 2 구현중_25.2.6(목) (0) | 2025.02.06 |
일정 관리 앱 Develop 개인과제 관련 트러블슈팅 TIL 모음 (0) | 2025.02.06 |