8주차 - WIL

장동희·2023년 4월 9일
0

항해99

목록 보기
8/8

실전 프로젝트

프로젝트 소개

서로의 위치를 기반으로 중간지점을 찾아주고, 그 지점에 있는 술집들을 찾아주는 사이트입니다.

구현한 기능

1. JWT 방식의 인증(보안) 강화 방식인 Access Token & Refresh Token 인증 방식 로그인

2. MailSender와 JavaMailSender 메일 발송을 사용한 임시비밀번호 발급 비밀번호 찾기

3. 회원가입 , (이메일, 닉네임)중복체크, 회원정보 수정, 마이페이지

4. 카카오 검색 API 연결 후 술집 리스트 보내주기

오류가 났던 부분

1. 메일 전송하는 부분

public void mailSend(MailDto mailDto) {
        System.out.println("전송 완료!");
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(mailDto.getAddress());
        message.setSubject(mailDto.getTitle());
        message.setText(mailDto.getMessage());
        message.setFrom(FROM_ADDRESS);
        message.setReplyTo(FROM_ADDRESS);
        mailSender.send(message);
    }

mailSender 부분에서 자꾸 Consider defining a bean of type 'org.springframework.mail.javamail.JavaMailSender' in your configuration오류가 발생. 이 오류는 Configuration을 찾지 못해 생긴 오류였다. 그래서 해결책으로 @Autowired 어노테이션을 달아주었더니 자동주입을 할 수 없다는 오류가 발생했다. 그래서 JavaMailSender 타입의 bean을 새로 등록하면 된다는 생각을 하였다. config를 관리하는 디렉터리에 mail이라는 디렉터리를 만들고 MailConfig.java를 만들어주었다. 그랬더니 해결이 되었다. 그래서 생각했다 이건 yml파일의 값을 읽지 못해서 발생하는것이라고 생각하였고 처음에는 yml파일의 이름을 mailApplication.yml로 설정하였는데 application.yml로 수정하고 MailConfig.java를 지웠더니 정상적으로 작동하였다.

2. 한글 깨짐 오류

@GetMapping("/kakao")
    public Map callApi(@RequestParam(required = false) String y,
            @RequestParam(required = false) String x,
            @RequestParam String query,
            @RequestParam Integer radius,
            @RequestParam Integer page,
            @RequestParam Integer size,
            @RequestParam(required = false) String sort){
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Authorization", "KakaoAK "+key);
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
        		.queryParam("query", query)
        		.queryParam("y", y)//인자
                .queryParam("x", x)//인자
                .queryParam("radius", radius)
                .queryParam("page", page)
                .queryParam("size", size)
                .queryParam("sort", sort);
        HttpEntity<String> entity = new HttpEntity<>(httpHeaders);

        return restTemplate.exchange(builder.toUriString(), HttpMethod.GET, entity, Map.class).getBody();
    }
}

해결 방법 : RestTemplate 객체를 사용하여 url 주소를 호출과 동시에 파라미터를 전달 해줄 경우 Uri 객체에 파라미터를 넣어 코드를 작성하여야한다.
Uri targetUrl= UriComponentsBuilder.fromUriString(BASE_URL)
.path("/android/played.json")
.queryParam("name", nome)
.build()
.toUri();
return restTemplate.getForObject(targetUrl, Name.class);
이부분 참고하여 수정했다.

수정 후 :

 @GetMapping("/kakaoApi")
    public Map callApi(
            @RequestParam(required = false) String y,
            @RequestParam(required = false) String x,
            @RequestParam String query,
            @RequestParam Integer radius,
            @RequestParam Integer page,
            @RequestParam Integer size,
            @RequestParam(required = false) String sort
            ){
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Authorization", "KakaoAK " + key);
        HttpEntity<String> httpEntity = new HttpEntity<>(httpHeaders);
        URI targetUrl = UriComponentsBuilder
                .fromUriString(url) //기본 url
                .queryParam("query", query)
                .queryParam("y", y)//인자
                .queryParam("x", x)//인자
                .queryParam("radius", radius)
                .queryParam("page", page)
                .queryParam("size", size)
                .queryParam("sort", sort)
                .build()
                .encode(StandardCharsets.UTF_8) //인코딩
                .toUri();
        ResponseEntity<Map> result = restTemplate.exchange(targetUrl, HttpMethod.GET, httpEntity, Map.class);
        return result.getBody(); //내용 반환
    }

회고

이번 주 최대한 많은 기능을 구현하려고 노력했다. 코드를 구현하는데 오류가 발생하면 빠르게 해결하지 못한점이 너무 아쉬웠다. 많은 정보를 검색하고 아직은 적용하는데 시간이 많이 소모되는거같다. 처음부터 코드를 짤때 효율적으로 짜려고하는것이 중요하다라는것을 느낄 수 있는 주간이였다. 다음주부터는 처음 부터 설계를 완벽히하고 코드를 짜야겠다.

0개의 댓글