본문 바로가기
개인 공부용 프로젝트/schedule.jdbc.api

트러블슈팅 : 필수과제 버그 수정

by pon9 2024. 12. 5.

몰랐는데 jdbc는 jpa처럼 entity를 자동생성해주지 않아서 테이블을 미리 만들어놓고 시작해야되더라..

자꾸 swagger에서 500 서버연결 오류가 나서 코드도 고쳐보고 했는데 안되길래 찾아보니.. 일단 이게 문제인 듯 했다.

뭐 그 덕에 코드 구조도 싹다 고쳤다. response 단에도 dto만들어주고, controller에서도 ResponseEntity로 값을 반환하도록 고쳤다.

combinedDto를 만들어서 password와 name,content를 같이 받는 경우 / password만 따로 받는 경우를 분리했다.

또한 responseEntity를 사용해 올바른 http코드로 값을 반환하도록 했다. delete의 경우 nocontent()로 204코드를 반환한다.

아무튼 좀 더 restful한 api 설계를 해보았다..

 

swagger에서도 자꾸 비밀번호 치고 들어가는거 짜증나서 securityConfig 설정 permitall()로 그냥 해줬다.

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf((csrf) -> csrf.disable());

        http.sessionManagement((sessionManagement) ->
                sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        );

        http.authorizeHttpRequests((authorizeHttpRequests) ->
                authorizeHttpRequests
                        .requestMatchers("/v3/api-docs/**", "/swagger-ui/**").permitAll()
                        .anyRequest().permitAll()
        );

        return http.build();
    }

bcrypt하나 쓸려다가 이 설정까지 해주게됐다..

 

똑같이 실행해봤는데 아직 postmapping에서 똑같은 에러가 난다. 

json형식도 올바르고 request url도 맞는데 왜지.

 

logging.level.org.springframework=DEBUG
logging.level.com.schedule=DEBUG

그 전에 작업하던 파일을 복붙한 탓에 logging level에 com.example이 들어가있었다. 지금 폴더명으로 바꿔주었다.

@PostMapping
    public ResponseEntity<ScheduleResponseDto> saveSchedule(@RequestBody CombinedRequestDto dto) {
        System.out.println(dto);
        return ResponseEntity.ok(scheduleService.saveSchedule(dto));
    }
    
public ScheduleResponseDto saveSchedule(CombinedRequestDto dto){
        String encodedPassword = passwordEncoder.encode(dto.getPasswordRequestDto().getPassword());
        Schedule schedule = ScheduleMapper.toEntity(dto.getScheduleRequestDto(), encodedPassword, UUID.randomUUID());
        System.out.println(schedule);
        scheduleDao.save(schedule);
        return ScheduleMapper.toDto(schedule);
    }

그리고 컨트롤러와 서비스단에서 sout을 찍어보았다.

보니까 콘솔은 제대로 찍히는데 uuid자료형이 들어가야 하는 곳에 string이 들어갔다.

여기 이 .toString()이 문젠데,

뭘 골라야 uuid자료형을 담을 수 있을지 몰라서 대충 .toString()으로 처리했던 것 같다..

setObject로 하니까 빨간줄은 사라지길래 이렇게해서 실행해봤다.

이번엔 값이 들어가긴 하는데 id가 null로 나와서 좀 곤란한 상황이다. 어쩔 수 없이 그냥 toString()으로 쓰고, 데이터타입을 varchar(100)으로 바꿔줬다. 

근데 string과 varchar(100)으로 바꿔줬음에도 null로 들어가길래 db를 확인해보니

여기에는 또 정상적으로 잘 들어가있다.

그래서 delete를 시도해보았다.

왜 잘 되지? 처리는 204로 정상적으로 잘 되는걸 보니 responseDto단에서 문제가 있는 듯 했다.

알고보니 mapper쪽에서 id를 처리하지 않고 있었고.. 

추가해주었다.

이제 정상적으로 잘 출력된다.

필수과제 끝!