CODING/스파르타 내일배움캠프 TIL

41_크기가 작은 부분 문자열_일정관리 Develop 주석 작성(Javadoc) 및 리팩토링_25.2.12(수)

codingTrip 2025. 2. 12. 22:52

코트카타

43) 크기가 작은 부분 문자열

나의 풀이

import java.util.*;

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        int start = 0;
        int end = p.length();
        long pNumber = Long.parseLong(p);
        List<Long> values = new ArrayList<>();

        while (end<=t.length()){
            values.add(Long.parseLong(t.substring(start, end)));
            start++;
            end++;
        }
        
        for (Long v : values) {
            if (v <= pNumber){
                answer++;
            }
        }
        return answer;
    }
}

int로 하니 런타임 에러가 발생했다.

범위에 따른 데이터 타입도 잘 생각해야 되겠다.

 

다른 분들의 풀이

import java.util.stream.LongStream;

class Solution {
    public int solution(String t, String p) {
        long targetNumber = Long.parseLong(p);
        int targetNumberLength = p.length();

        return (int) LongStream.range(0L, t.length() - targetNumberLength + 1L)
                .mapToObj(i -> t.substring((int) i, (int) i + targetNumberLength))
                .mapToLong(Long::parseLong)
                .filter(number -> number <= targetNumber)
                .count();
    }
}

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/147355/solution_groups?language=java

스트림이 아직 익숙하지 않지만

그래도 다른 분들의 풀이를 보면서 익숙하게 만들고자 한다.


2025.02.12(수)

일정관리 Develop 주석 작성(Javadoc) 및 리팩토링

Javadoc 이용한 주석 작성

지난 번 과제 때 튜터님께서 Javadoc을 이용해서 주석을 작성하는 것을 추천하셔서 아래와 같이 작성해보았다.

예시)

/**
     * 회원 생성(회원가입)
     * @param name 회원명
     * @param email 이메일
     * @param password 비밀번호
     * encryptPassword : 비밀번호 암호화 후 저장
     * @return SingUpResponseDto 회원 생성 응답 DTO 반환
     */
    @Transactional
    public SingUpResponseDto save(String name, String email, String password) {

        String encryptPassword = passwordEncoder.encode(password); //비밀번호 암호화

        Member member = new Member(name, email, encryptPassword);
        Member savedMember = memberRepository.save(member);

        return new SingUpResponseDto(savedMember.getId(),savedMember.getName(),savedMember.getEmail());
    }

 

리팩토링

- 반복적으로 사용되는 부분을 따로 메서드로 분리하기

예시)

     * getMemberByIdOrElseThrow : 회원 id로 회원 조회

       : 선택 조회, 수정, 삭제 시 필요한 기능이었는데 이를 메서드로 분리했다.


     * validateMemberId : 본인(작성자) 검증 로직

      : 선택 수정, 삭제 시 작성자인지 검증하는 로직이 필요했는데 이 부분을 메서드로 분리했다.

/**
     * 회원 선택 수정(회원명, 이메일 수정)
     * @param id 회원 id
     * @param name 회원명
     * @param email 이메일
     * @param loginMember 세션 로그인 멤버
     * getMemberByIdOrElseThrow : 회원 id로 회원 조회
     * validateMemberId : 본인(작성자) 검증 로직
     * @return MemberResponseDto 회원 응답 DTO 반환
     */
    @Transactional
    public MemberResponseDto updateNameAndEmail(Long id, String name, String email, Member loginMember) {
        Member member = getMemberByIdOrElseThrow(id);
        validateMemberId(id, loginMember);
        member.updateNameAndEmail(name,email);
        return new MemberResponseDto(
                member.getId(),
                member.getName(),
                member.getEmail()
        );
    }
    
/**
     * 회원 id로 회원 조회
     * @param id 회원 id
     * @exception ApplicationException 해당 id를 찾을 수 없는 경우, 404 예외처리(커스텀 예외처리 ID_NOT_FOUND)
     * @return 회원 id에 해당하는 회원 반환
     */
    private Member getMemberByIdOrElseThrow(Long id) {
        return memberRepository.findById(id).orElseThrow(
                () -> new ApplicationException(ErrorMessageCode.NOT_FOUND,
                        List.of(new ApiError(CustomErrorMessageCode.ID_NOT_FOUND.getStatus(),
                                CustomErrorMessageCode.ID_NOT_FOUND.getMessage())))
        );
    }

    /**
     * 본인(작성자)만 본인(작성자) 검증 로직
     * @param id 회원 id
     * @param loginMember 세션 로그인 멤버
     * loginMember(로그인 정보)의 id와 DB에서 조회한 id 비교
     * @exception ApplicationException 각각의 id가 불일치할 경우 403 예외처리(커스텀 예외처리 NOT_OWNER)
     */
    private static void validateMemberId(Long id, Member loginMember) {
        if (!loginMember.getId().equals(id)){
            throw new ApplicationException(ErrorMessageCode.FORBIDDEN,
                    List.of(new ApiError(CustomErrorMessageCode.NOT_OWNER.getStatus(),
                            CustomErrorMessageCode.NOT_OWNER.getMessage())));
        }
    }

 

다음에 진행할 때에는 Javadoc을 활용해서 미리 주석도 달아두고,

리팩토링하면 좋을 만한 점들을 미리 생각해두면서 작업하면 좋을 것 같다는 교훈을 얻었다.