[Spring#45] 주특기 플러스 주차 - ORM, JDBC, MyBatis / 알고리즘 : 신고 결과 받기

김한준 Hanjun Kim·2023년 12월 12일
1

내일배움캠프

목록 보기
46/70

광란의 찌르기 승부는 내가 이겼다.

다음엔 봐주지 않겠지?


주특기 플러스 주차

느낀점

사실 오늘 배운 내용을 정리하다가 우연히 한 블로그를 보게 되었다.

블로그 링크 :
https://velog.io/@wonizizi99/DB-Doker-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-DB-%EC%82%AC%EC%9A%A9%EB%B2%95

블로그 내용을 보아, 이전 내배캠 기수분이 쓰신 글 같은데
아래 내가 쓴 내용(JDBC 실습) 과는 달리 한 눈에 봐도 정리가 깔끔하게 되어 있고, 어떻게 실행해야 하는지와 무슨 내용인지까지 이해할 수 있었다.

내 글이 잘 정리했다고는 생각하지 않았지만 그래도 나름 쓸만하다고 생각했는데 저 글을 보니 다시 생각하게 된다.

어휘력또한 책을 좀 더 읽어야겠다는 생각을 했다.

또한

이전 조 팀원분들과 열심히 회의를 했는데..

정리 해 두었던 내용을 역시 하루마다 복습을 해서 내것으로 만들고

매일 질문할수록 새로운 궁금증이 생기는데.. 아직 멀었다고 생각한다.

간단하게 정리 해 두려고 한다.

도커 : 스프링 세팅을 다 하고 ( mysql, 라이브러리 등등) 다른 컴퓨터 가면 또 해야되잖아요
세팅을 해놓은 걸 가지고 다른 컴퓨터에서 금방 쓸 수 있게 해주는 용도

보통 jar 파일보단 도커를 올리고 / 도커 허브(=클라우드)를 만들어서 공유해서 이미지를 가져오거나 등등 이런느낌임

페이징 : limit / offset으로 하는거

프레임워크 vs 라이브러리 : 끌려가느냐 vs 사용하느냐

마이그레이션 : 원래 쓰던거에서 다른거로 옮기는것

ACCESSLEVEL.PROTECTED
이거 검색해보니 ALLARG만 나옴
NOARGU와 BUILD랑은 같이 못씀
최소 protected나 noargu만 entity 생성 할 수 있음

1주차 2강

왜 ORM의 탄생 배경을 알아야 하나?

  • "모든 회사에 JPA가 적용되어 있지는 않다!!"

    • 정말 이번 프로젝트가 다시한번 잘 만든 프로젝트였다는걸 깨닫게 된다.
    • QueryMapper를 쓰는 곳도 있다.
  • ORM은 DB 연동 기술이론이다

    • JDBC > ( QuerryMapper > ORM(JPA)) 는 포함/개선 관계이다.
  • DB 탄생 후 Java앱과 연동을 위해 JDBC가 탄생했다.

    • JDBC : Java Database Connectivity

JDBC 실습

  • DriverManager : 사용할 애플리케이션에 대해 사용 가능한 JDBC(Java Database Connectivity) 드라이버 세트를 관리합니다.

    1. DockerDesktop 설치
    • 다음 명령어를 인텔리제이 terminal에서 실행
      docker run -p 5432:5432 -e POSTGRES_PASSWORD=pass -e POSTGRES_USER=teasun -e POSTGRES_DB=messenger --name postgres_boot -d postgres
    • 도커를 -p 포트번호에서 / -e 환경변수를 =pass 으로 지정 / 환경변수 유저이름을 =khj로 하고 / 환경변수 db 이름을 messenger 으로 하고 / --name container이름을 지정하고 / 백그라운드에서 -d 데몬으로 실행하겠다.
    • 도커 실행은 다음 명령어
      docker exec -i -t postgres_boot bash
    • exec : 실행하겠다. postgres_boot 컨테이너에서 실행하겠다. bash : 터미널처럼 커맨드라인 인터페이스 명령어를 날릴수 있는
    • 계정을 루트 -> su - postgres 명령어로 바꿔줌
    • post sql 명령어 : psql --username teasun --dbname messenger
      DB 이름도 같이 명시
    • \list (데이터 베이스 조회)
    • \dt (테이블 조회)
  1. DB 연결
  • Connection을 DriverManager를 통해 받아오면 얻을 수 있다.
    • Statement를 얻는다?
    • createSql을 통해 만들고 PreparedStatement 만들어서 execute로 실행
  • 제일 중요한 자원해제
  • tryWithResorce 방식 : 자동으로 close를 해준다!
    예) try(Connection connection = DriverManager.getConnection(url, username, password))
  1. DAO?
  • 쿼리를 직접 작성하는게 아니라 DAO 객체를 만들어서 이런 동작을 대신 해주는것.
    • connection, statement 등등 이런것을 메서드 내에서 동작하게 해줌
  • AccountDAO 만들어서 테스트
    • Account 객체를 받기 위해 AccountVO 생성 : Account의 ID나 이런것들을 가지고 있음
    • executeUpate : 몇개가 업데이트 되었는지 반환해준다
    • executeQuery : ResultSet : 응답값을 받아서 넣어줌
      • ResultSet을 받아올 때 (여러개 올 수 있으니) rs.next를 통해 다음것을 받아온다

JDBC의 여러 문제로 QueryMapper가 탄생했다.

  • JDBC로 직접 SQL을 작성했을 때 여러 문제가 있다.
  • SQL 쿼리 요청시 중복 코드 발생
    • DB별 예외에 대한 구분 없이 예외처리
    • Connection, Statement 등.. 자원 관리를 따로 해줘야함
      -> SQL Mapper와(JDBC Template, MyBatis)
      ORM(JPA, Hibernate) 등장
    • SQL Mapper : SQP <-> Object
    • SQL문과 객체의 필드를 매핑하여 데이터를 객체화
    • JDBC Template
    • 쿼리 수행 결과와 객체 필드 매핑
      • 반복적 처리 대신 해줌
      • DAO - (JDBC Template) - JDBC Driver - Database 순으로 중간에서 대신 관리
  • JDBC 실습

    • 의존성 추가(Spring을 쓰기 위한 Spring버전 명시까지)
    • @JdbcTest : Spring 전체를 띄우지 않고 Jdbc관련된 일부분만 테스트하겠다는 것
    • @AutoConfigureTestDatabase : 테스트는 기본적으로 테스트 패키지에서 사용하는 DB를 가리키게 되어있는데,
      Real DB를 사용하겠다는것
    • @Rollback : Test에서 실행되는 쿼리는 자동 롤백되게 트랜잭션 되어있는데 이것을 false로 바꿈
  • AccountRowMapper : AccountVO에다가 어떻게 받아올 지 정해야 하니까 Mapper 를 정해줘야 한다.
    -> JDBC Template을 가지고 select,insert를 해보았다.

MyBatis

  • 반복적인 JDBC 프로그래밍을 단순화

  • SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리(어노테이션)

    • SQL을 직접 작성하는것은 피곤하다(하지만 또전프로젝트 생각)
    • 테이블마다 비슷한 CRUD 반복, DB 타입 및 테이블에 종속적
    1. XML 활용
    • configuration을 만들어서 DB와 연결 정보를 만들어 @Bean으로 등록 해줘야함.(+ resources에 매핑 파일 추가)
    1. Annotation 활용
      ?

QueryMapper의 DB 의존성 및 중복 쿼리 문제로 ORM이 탄생했다.

  • DB를 의식하지 않고 개발을 도와주는게 ORM

알고리즘

깃허브링크:
https://github.com/wkdehf217/codingTest/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/1/92334.%E2%80%85%EC%8B%A0%EA%B3%A0%E2%80%85%EA%B2%B0%EA%B3%BC%E2%80%85%EB%B0%9B%EA%B8%B0

와 이번 문제 1시간 50분 걸려서 풀었다.

그래도 푼게 어디냐

처음에 중복값을 제거하지 않아서 오래걸렸다.

이 부분만 거의 50분 가까이 못 찾아서 고민한 것 같다.

알고리즘적으로는 그래도 맞았으니까 기분은 좋다!

profile
개발이 하고싶은 개발지망생

0개의 댓글