728x90

1 - 3. 스프링 부트 Mapper와 Mapper 오류, Mail 전송

오늘은 회원에 관한 코드들을 스프링에서 스프링 부트로 바꾸는 작업을 진행하였습니다. 코드를 가져와서 실행을 하던 중에 mapper를 찾지 못하는 에러가 발생했습니다. 


1. @Mapper 어노테이션


스프링에서 mybatis를 사용하는 방식은 SqlSession, SqlSessionTemplate을 설정하고 maper네임스페이스. id, parameter 등의 메서드를 통해 쿼리를 사용하였지만 스프링 부트, mybatis 3.0 이상에서는 sqlSessionTemplate을 설정하고, selectone 메서드를 사용하지 않고 @mapper 어노테이션을 이용해 메서드명과 xml 파일의 id를 매핑시켜 편리하게 사용할 수 있다.


mapper 인터페이스에 @Mapper 어노테이션을 붙여주니 해결되었다.

참고 블로그 : https://frozenpond.tistory.com/85

 

[spring] mapper 어노테이션을 통한 springboot, mybatis 세팅하기

spring boot로 프로젝트를 생성, Mybatis 연동하는 예제입니다. 스프링에서 mybatis를 사용하는 방식은 SqlSession, SqlSessionTemplate을 설정하고 selectOne(maper네임스페이스.id, parameter) 등의 메서드를 통..

frozenpond.tistory.com

 


2. 자바 명명규칙

진행하던 중에 프로젝트 패키지 이름이 바뀌고 클래스 이름 등 자바 명명규칙을 어긴 것들을 발견해서 경로들을 수정해주었다. 

참고 블로그 :  https://ozofweird.tistory.com/entry/Java-%EB%AA%85%EB%AA%85-%EA%B7%9C%EC%B9%99


왼쪽은 수정 전 오른쪽은 수정 후 사진이다.

또한 전에 진행했던 데이터 베이스 테이블들 이름이 너무 헷갈려서 명확하게 이름을 다시 지었다.

 


왼쪽은 수정 전 오른쪽은 수정 후 사진이다.


3. Mapper.xml (not found) 오류


유효성 검사를 실시하면 위와 같은 오류가 발생했다. 진짜 찾는데 3일 내내 찾았는데 못 찾았다. 공식문서와 수많은 블로그를 찾아봤는데 다해봤는데도 안됐다. 마지막 4일째 오류를 해결했다... 이유는 Mapper.xml 파일이 하나라도 오류가 나면 전체가 매핑에 실패해 오류가 난다.

mybatis.mapper-locations= mapper/*.xml

application.properties에 위에 코드를 추가시켜준다.


Jsp에서 Mybatis를 이용할 때 스프링 부트에서 만들어주는 resources에 mapper 밑에 Mapper.xml 파일을 추가시켜준다.


보통 Mapper를 찾지 못하는 오류는 mapper namespace의 경로가 잘못되었거나 Mapper.xml 파일의 id와 Mapper.java파일의 메서드 이름이 잘못된 오류이거나 오타이다.


4. 회원가입 인증 메일 전송

회원가입을 할 때 인증번호를 보내는 기능이 있었는데 구글 계정만 있으면 무료로 발송할 수 있는 Gmail SMTP Server를 이용했다. 메일전송은 MailSender 인터페이스를 상속받은 JavaMailSender를 사용해 구현하였습니다. 새로 스프링 부트에는 dependency와 설정이 빠져있어 오류가 발생했다.

implementation 'org.springframework.boot:spring-boot-starter-mail'

build.gradle dependencies에 위에 코드를 작성한다.



Gmail SMTP Server를 이용하려면 위와 사진과 같은 설정이 필요하다.

위의 설정은 application.properties에 추가 해줘야 한다.

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.username=gmail
spring.mail.password=password

잘되는것을 확인할 수 있다.


오늘의 회고

mapper 오류에 4일을 걸렷다ㅠㅠ 부트로 바꾸는 프로젝트를 진행하기 전에 제가 진행했던 프로젝트여서 코드 분석을 하지 않고 바로 진행했던 점이 문제로 다가왔다. 프로젝트를 끝낸지 7개월이라는 시간이 흘렀고 제가 작성하지 않은 코드들도 있어서 파악이 안되는 문제가 발생했다. 오늘 내일은 코드를 분석하는 작업을 진행하려고 합니다. 분석을 끝내고 위에 진행했던 코드들의 테스트 코드를 블로그에 작성하겠습니다.

728x90
728x90

오늘은 스프링 부트에서 MyBatis 연결을 하려고 합니다. 

1-2 스프링 부트 MyBatis 연결

1. 스프링 부트 MyBatis 설정

implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
runtimeOnly 'mysql:mysql-connector-java'

build.gradle dependencies에 위의 코드를 추가시켜줍니다. 

# database
spring.datasource.url: jdbc:mysql://host:3306/DatabaseName?characterEncoding=utf8
spring.datasource.username: DatabaseName
spring.datasource.password: password
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver

# mybatis
mybatis.config=mybatis-config.xml
mybatis.type-aliases-package: com.example.demo.model
mybatis.mapper-locations: mapper/*.xml

application.properties에 위에 코드를 추가 시켜줍니다. url에는 자신의 포트번호와 데이터베이스 이름을 입력해주고, 유저네임과 패스워드도 자신과 맞게 입력해줍니다. mapper-locations도 mapper. xml이 있는 파일로 설정해주면 끝입니다.


2. DataBase연결 Test

이제 DataBase연결이 잘 되었는지 Test를 해보려고 합니다. Test에 dbTest페키지를 만들고 MyBatisTest class파일을 만들어 줍니다.

package com.skylife_Transformation.dbTest;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;

public class MyBatisTest {
    // MySQL Connector 의 클래스. DB 연결 드라이버 정의
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    // DB 경로
    private static final String URL = "jdbc:mysql://localhost:port/name?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false";
    private static final String USER = "name";
    private static final String PASSWORD = "password";

    @Test
    public void testConnection() throws Exception {
        // DBMS에게 DB 연결 드라이버의 위치를 알려주기 위한 메소드
        Class.forName(DRIVER);
        try {
            Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
            System.out.println(connection);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

MyBatisTest파일에 위의 코드를 추가시켜줍니다. DB 커넥션이 제대로 생성되었는지를 출력해 확인해보는 과정입니다.

DB URL에 allowPublicKeyRetrieval은 클라이언트 옵션을 추가 하여 클라이언트가 서버에서 자동으로 공개 키를 요청할 수 있도록 하는 것입니다. default는 false이고 MySQL 8.0 이상은 이를 true로 지정하지 않을 시 public key retrieval is not allowed 에러가 발생할 수 있습니다. 그 뒤에 userSSL은 default는 true이고 false로 지정 시 SSL 사용을 막을 수 있다. 또한 하지만 개발, 혹은 테스트 중에서만 비활성화시키는 걸 추천합니다. 배포 시엔 useSSL를 false로 지정하기보단 SSL을 설정해주면 됩니다.


위의 Test코드를 실행하면 정상적으로 실행되는 것을 확인 할 수 있다. 


참고 블로그

https://doozi0316.tistory.com/entry/Spring-Boot-MyBatis-MySQL-%EC%97%B0%EB%8F%99-%EB%B0%A9%EB%B2%95


오늘의 회고

오늘은 MyBatis연결부터 연결 테스트 까지 진행하였습니다. URL을 입력할 때 allowPublicKeyRetrieval, userSSL은 기존에 사용했었지만 개념과 사용 이유에 대해 몰랐었는데 새롭게 알게 되었습니다. 리펙토링을 진행하다가 빠진 개념 등 다시 정리하면서 가야 될 것 같습니다.

728x90
728x90

이전에 진행했던 팀 프로젝트 입니다. Git에서 Readme만 가지고 왔습니다.

 

header

🎬 SkyLife 프로젝트

SkyLife는 예매의 편리함과 커뮤니티를 제공하여 정보를 공유할 수 있게 만들어진 항공 예매 플랫폼 서비스입니다.

여행을 즐기는 사람들이 증가하게 되면서 자연스레 항공을 이용하는 빈도 또한 높아지고 있다.
그러나 항공 이용객의 증가 추세에 비하여 항공권 예매 플랫폼 서비스에는 미흡한 부분이 있다.
원하는 시간과 가격 등을 반영한 항공권 티켓을 예매하기위해 항공권을 검색하면
검색 결과에는 원치않는 정보가 많아 가독성이 떨어진다.
이에 항공권 검색 과정의 가독성을 높여 예매의 편리함을 제공하고,
주변 여행지 추천 및 커뮤니티를 제공하여 여행 준비의 편리함과
여행 지역의 정보를 공유할 수 있는 항공 예매 플랫폼 서비스를 만들고자 한다.


📆 작업 기간

2021.6.27 ~ 2021.7.20 (24일간)

👩‍💻 팀원 구성

박현성, 김다슬, 고정현, 유승준

🎯 기술 스택

Front-end

HTML5 JavaScript Bootstrap jQuery

Back-end

Java Spring MySQL

Communication Tools

GitHub Discord Notion

💻 DB 명세서

📜 API 사용내역

1. 카카오 로그인, 맵, 페이 API

2. 구글 로그인 API

3. 항공조회, 주차장조회 API(공공데이터포탈)


📄 기능 구현 사항 (유튜브로 이동)

1. 메인 페이지

  • (1) 항공편, 주차장 조회

2. 항공 조회 페이지

  • (1) 항공사별 카테고리
  • (2) 페이징 처리
  • (3) 찜 기능
  • (4) 카카오 페이 결제 API
  • (5) 결제 상세보기

구현기능 : 1, 2


구현기능 : 3, 4, 5


3. 회원가입, 로그인 페이지

  • (1) 이용약관 동의
  • (2) 아이디, 이메일 중복체크, 인증번호 인증
  • (3) 카카오 로그인 API
  • (4) 구글 로그인 API

구현기능 : 1, 2


구현기능 : 3


구현기능 : 4


4. 서비스 페이지(지도 API, 주차장 API)

  • (1) 지도 카테고리별 위치, 현재 위치 표시, 검색기능
  • (2) 각 공항별 주차장 실시간 정보

구현기능 : 1

구현기능 : 2


5. 게시판

  • (1) 글 작성, 수정/삭제, 상세보기, 조회수, 페이징 처리, 검색
  • (2) 댓글 작성, 수정/삭제, 페이징 처리

구현기능 : 1


구현기능 : 2


6. 공지사항

  • (1) 관리자 공지사항 추가, 수정/삭제

7. 마이 페이지

  • (1) 회원정보 조회/수정, 탈퇴
  • (2) 찜, 결제 목록 조회/삭제
  • (3) 목록 조회
  • (4) 카카오 페이 결제 API

8. 관리자 페이지

  • (1) 회원 목록 조회/삭제, 결제목록 조회/통계(월별 매출)
  • (2) 공지사항 작성, 수정, 삭제
  • (3) 게시글, 댓글 삭제

구현기능 : 1


구현기능 : 2


구현기능 : 3

728x90
728x90

개요

skyLife_Transformation 프로젝트로 기존에 스프링으로 진행했던 프로젝트에서 성능반복되는 코드고려하지 않고 그저 기능이 구현되고 돌아가기 위한 코드를 작성했던 프로젝트를 스프링 부트로 바꾸고 성능을 개선하는 프로젝트를 진행하려고 합니다. 천천히 단계별로 개선을 시켜나갈 생각입니다.


1-1 스프링에서 스프링 부트

1. 스프링 부트 프로젝트 만들기

https://start.spring.io/ 에서 스프링 부트를 쉽게 만들 수 있습니다.

저는 Build Tool은 Gradle, 스프링 부트 버전은 2.7.0, Packaging은 Jar, Java 11 버전을 사용할 것입니다.

Dependencies는 Lombok, Spring Web, Spring Security, MyBatis Framework, MySQL Driver, Spring REST Docs를 추가해주었습니다.


2.  스프링 부트 JSP를 위한 수정사항

일단 저는 기존에 진행했던 프로젝트에서 뷰는 수정을 하지 않으려고 합니다.

기존 프로젝트는 jsp로 진행을 해서 스프링 부트에서 jsp를 사용해주려면 설정해줘야 하는 것들이 있습니다.

우선 JSP도 템플릿 엔진이기 때문에 사용하기 위해서는 별도의 라이브러리가 필요합니다.

implementation "org.apache.tomcat.embed:tomcat-embed-jasper"

build.gradle를 파일에 dependencies 부분에 위의 코드를 추가를 해줍니다.

또한 JSP를 사용하기 위해서는 webapp와 WEB-INF 폴더를 포함한 구조로 프로젝트를 변경해야 합니다.

스프링 부트에서 사용하는 뷰 리졸버의 경로를 변경해야 합니다. 뷰 리졸버의 경로는 application.properties에서 변경합니다.

spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp

위의 코드를 application.properties에 추가시켜줍니다. Controller 코드까지 작성하면 스프링 부트에서 jsp를 사용할 수 있습니다.

프로젝트의 메인화면입니다. 성공적으로 나오는 것을 확인할 수 있습니다.


3. 인텔리제이와 Github연동

인텔리제이 상단 메뉴에서 VCS를 누르고 Enable Version Control Integration을 클릭하면 밑에 사진과 같은 창이 나옵니다.

위의 창에서 ok를 클릭합니다.

위에서 ok를 클릭하면 상단 메뉴가 Git으로 바뀐 것을 확인하실 수 있습니다. Git 메뉴에서 Manage Remotes를 클릭하면 오른쪽 사진과 같은 창이 나옵니다. 오른쪽 사진에서 Add를 눌어주면 URL을 입력할 수 있는 밑에와 같은 창이 나옵니다.

URL 입력 창에 깃허브에서 레파지토리 주소를 복사해서 붙여 넣어줍니다.

밑에 Commit Message를 적을 수 있는 칸이 있고 Commit Message를 작성한 후 Commit and Push를 클릭해 주시면 깃허브에 잘 올라가는 것을 확인하실 수 있습니다.


오늘의 회고

오늘은 스프링 부트에서 프로젝트 메인화면을 띄우는 것부터 진행하였습니다. 뷰를 만들고 필요 없는 코드와 반복되는 코드들을 수정하고 프로젝트 설계부터 효율적인 방법을 고려해 진행할 예정입니다.

728x90

+ Recent posts