저번게시글에서 MySQL 계정을 생성하고 스키마를 만들어보고 인텔리제이와 연동을 해보는 작업을했다
이번에는 연동되어있는 데이터베이스에 직접 SQL문을 날려서 값을 넣고 빼는 작업을 해보겠다
우선 데이터베이스에 SQL을 보내주기 위해서는 JDBC라는것을 사용해야하는데 간단하게 JDBC에 대해서 알아보도록 하자
JDBC란 무엇일까
먼저 JDBC는 Java DataBase Connetivity로써 자바프로그램이 데이터베이스와 서로 연동되어있을때 데이터를 주고받을수있게 해주는 인터페이스 라고 보면 될거같다
기본적으로 애플리케이션과 DBMS(여기선 MySQL) 사이에서 번역해주는 역할을 하는데 여기서 중요한점은 왜 JDBC가 나왔는지 알아봐야한다
만약에 상상을해보자 많은 관계형 데이터베이스들의 통신방법들이 전부 제각각이면 어떻게 될까?
MySQL을 쓰다가 다른 관계형 데이터베이스로 옮겨야하는 일이 생겼다 그러면 코드들이 전부다 고쳐야하는 지옥이 펼쳐질것이다
그래서 등장한것이 JDBC로 DBMS와 애플리케이션사이에서 통신하기위해 번역하는 역할을하여 만약 다른 DBMS로 바꿀일이 생겼을때 통신쪽은 건드릴필요가 없으니 유지보수에 훨씬 편해지게된다
한마디로 JDBC는 애플리케이션과 DBMS사이에서 통신하기위한 다리라고 보면될것이다
자 이제 본격적으로 JDBC를 사용해서 MySQL을 인텔리제이로 다뤄보도록 하자
JDBC 사용하기
우선 사용하기앞서 IDE으로 인텔리제이를 사용한다는 점을 유의해주길 바란다
우선 test 폴다안에 테스트 클래스가 있을텐데 없으면 만들어준다
사실 굳이 test안에 만들필요없이 java 안에 클래스를 만들어줘도 무방하다 그냥 실험하거나 확인할때는 test폴더안에서 하는게 버릇되어서 그렇다
클래스안에 이제 JDBC를 사용하여 데이터베이스를 조작해볼것인데
우선 시작하기 앞서 알아야할것이 있는데 항상 어떤것을 왜 사용하는지 알아야하고 큰 틀이잡혀있어야 이해하기가 쉽다
우리는 우선 데이터베이스 접속정보를 얻고 그다음 접속정보를 토대로 메소드를 사용하여 접속하고 접속이 다되면 SQL을 날려 데이터를 넣거나 뺸다음 Excute한다
그다음 연결을 끊어준다 이런순으로 진행한다고 보면될것이다
저번게시물에서 url과 드라이버클래스, 사용자 계정이름과 비밀번호를 기억하라고 한 이유가 여기서 나온다
JDBC를 사용하여 접속하기위해서는 위와같은 접속정보들이 필요하다 만약 접속정보를 알고싶으면 인텔리제이 맨오른쪽에 데이터베이스 -> 해당스키마 오른쪽클릭 -> 프로퍼티 에가면 알수있으니 참고하자
먼저 url, 아이디, 비밀번호를 변수에 담아주도록 하자
그다음 DriverManager에 getConnection 메소드를 통해서 매개변수로 url정보, 아이디이름 비밀번호를 주면 연결하게되고 Connection으로 사용할수있다
여기서 Connection은 인터페이스로 많은 기능을 제공해준다
참고로 getConnection부분에 빨간밑줄이 생기는데 그이유는 Checked Excetion이라서 그렇다 막 어려운건아니고 무조건 예외 처리를 해줘야 한다는것이다
그리고 Class.forName 메소드를 통해서 MySQL 드라이버를 넣어준다 ( DBMS 마다 값이 다르다 다른 DBMS 드라이버 클래스를 알고싶으면 전편 게시물을 참고해보자)
이제 SQL을 날리기전에 테이블을 하나 생성해주도록 하자 MySQL 워크벤치로 생성해도되고 인텔리제이에서 생성해도된다
나는 인텔리제이에서 직접 생성해보겠다 ( MySQL워크벤치 도 검색해보면 금방할수있을 정도로 쉽다 )
맨오른쪽 데이터베이스 -> springbasic(자기가 만든 스키마이름) -> 오른쪽클릭 -> 새로작성 -> 테이블을 통해서 손쉽게 테이블을 만들수있다
테이블 이름은 study로 하고 빨간네모칸안에 +를 눌러서 Column을 더추가해보도록 하자
우선 id, username, password 이렇게 3개를 가지는 테이블을 생성해보도록 할것이다
id에 데이터타입은 int와 자동증분( 칼럼에 값이 들어갈때마다 1씩 증가한다 ) not null, 그다음 네모칸친 3개점을 클릭해서 기본키로 설정해주도록 한다
그다음 username과 password의 데이터타입은 varchar(50) 으로 대충 설정해준다 varchar은 가변길이로 왠만한 문자가 들어가는 칼럼에는 varchar로 데이터타입을 해주는것이좋다 ( 엄청길면 text라던가 다양한 데이터타입이 존재한다)
MySQL안에 study라는 테이블을 만들고 안에 id, username, password를 만들었다 그다음 이제 안에들어갈 데이터를 직접 JDBC를 이용해서 넣어보도록 하자
다시 클래스안으로 돌아와서 위에서 만든 study 테이블에 값을 넣을텐데 그러기위해선 prepareStatement()라는 메소드가 사용된다
정말간단하게 괄호안에 자신이 수행할 SQL문을 넣기만하면 해당되는 SQL문을 데이터베이스에 보내준다
참고로 같은기능을 하는 Statement 라는 메소드도 존재하는데 PrepareStatement로 바뀌었기때문에 굳이 쓰지말자 Statement를 사용하게되면 SQL injection 같은 공격에 취약해진다 그러니깐 PrepareStatement를 사용하도록하자
sql 변수안에 SQL insert문을 담아주었다 간단하게 study테이블을 만들었을때 넣은 username, password칼럼에 값을 넣는것인데
SQL문법에 대해서 궁금하다면 여기를 클릭해보자 기본적인 insert, update, delete, select문은 자주쓰이기때문에 아는것이좋다
아무튼 insert into를 이용해서 study 테이블에 값을 넣는데 values에 값이 ?로 되어있다 이것은 아래 메소드를이용해서 따로 값을 넣어줄것이다
굳이 이럴필요없으면 직접 값을 넣어줘도되는데 보기편하게 메소드로 빼는것을 선호하는편이다
이제 setString을 이용해서 ?에 든값을 채워보도록 하자 첫번째?에는 홍길동, 두번째에는 임의의비밀번호를 넣어보았다
그다음 excuteUpdate를 이용해서 커밋해준다 ( 확정 지어준다고 생각하면 될것이다 ) 그러면 값이 잘들어갔나 확인해보도록 하자
MySQL 워크벤치에 들어가서 자기가 위에 접속정보를 가지는 Connection으로 접속하고 SQL 질의문을 만들어서 보내면된다
워크벤치에 들어가서 select를 통해서 study안에 든 값을 확인하면 제대로 들어간것을 볼수있다
두번 실행해서 2개의 값이 들어가있는데 여기서 id 같은경우는 자동증분이기 떄문에 username, password만 넣어주면 알아서 1씩 증가해 더해주게된다 그래서 굳이 값을 넣지 않아도 되는것이다
마지막으로 SQL문을 보내고 연결을 꼭 끊어줘서 최대한 성능에 신경쓰도록 하자
추가로 나는 study 테이블에 든값을 select로 직접 인텔리제이에서 확인하고 싶다면 excuteQuery()메소드를 사용하면된다
excuteQuery()안에 sql을 넣고 resultSet으로 받는다 그다음 next()로 안에 값이들어있을경우 출력하게하면 된다
JDBC 불편함
지금까지 JDBC를 이용해서 DBMS와 통신하는 방법에대해서 쭉 보았는데 불편함들이 존재한다
첫번째로 한파일에서 DB연결, SQL, JAVA가 모두존재하기 떄문에 향후 유지보수에 큰 어려움을 겪을 가능성이 매우높다
그리고 매번 연결하고, 끊는 소스코드를 계속해서 해야한다 즉 중복코드가 발생한다
그래서 다음에는 JDBC의 단점들을 Mybatis를 통해서 SQL을 밖으로 빼고 중복되는 과정들을 따로 빼내어 코드를 최대한 간결하게 만들어보도록 하자
정리
JDBC를 이용해서 데이터베이스와 통신하는건 좋았지만 매번 연결하고 끊는 과정이 번거롭고 한파일에 모든걸 담당한다
그래서 역할을 분리하기위해 Mybatis를 이용해서 중복코드도 제거하고 SQL을 따로빼내서 코드를 깔끔하게 해보자
'개발 > Spring' 카테고리의 다른 글
Spring(스프링) Bean을 통해 효율적으로 코딩 하기 (1) | 2024.12.15 |
---|---|
Springboot에서 Mybatis 사용하기 (2) | 2024.11.08 |
SpringBoot를 이용하여 MySQL과 연동하기(JDBC) (2) | 2024.11.06 |
Spring(스프링)에 IoC, DI 특징 자세히 알아보기 (0) | 2024.10.30 |
Spring boot Validation과 @Valid 애노테이션 활용하기 (0) | 2024.10.28 |