Post라는 클래스를 만들어서 데이터베이스에 post 테이블을 만듭니다.
@GeneratedValue의 strategy값을 IDENTITY 값으로 하면 mariadb, mysql, oracle에 맞춰서 바꿔줍니다.
@Lob annotation을 쓰면 해당 변수에 해당하는 가장 긴 타입으로 설정해줍니다.
content는 게시글을 저장할 것이기때문에 그냥 String 타입으로 저장하면 데이터베이스에는 varchar 타입으로 저장되는데 varchar 타입은 225 글자가 최대이기때문에 가장 긴 longtext 타입으로 설정해주어야 한다.
여기서 userId는 user 테이블의 아이디를 나타내줄 변수이다.
테이블을 만들고 데이터를 insert 해줍니다.
한줄씩 현재쿼리 실행을 해줍니다.
이때 user_id는 user테이블의 id를 나타내기때문에 foreign key로 사용할 것입니다.
post 테이블에 foreign key를 두는 이유는 user 테이블에 foreign key를 두는 이유는 user 테이블에 foreign key를 두면 한 사람이 게시글을 여러개 쓸 수 있기때문에 원자성이 깨지기 때문입니다.
foreign key를 두는 팁을 말하자면 1:N 관계에서는 N의 테이블에 foreign key를 설정하는 것이 좋습니다.
한 사람에 대한 정보가 두 테이블에 중복된 컬럼이 있을 때 한 테이블에 있는 정보만 바뀐다면 데이터의 무결성이 지켜지지 않았다고 합니다.
이때 join을 통해 손쉽게 무결성을 지킬 수 있습니다. 중복된 컬럼에 대한 정보를 한테이블에만 두고 join을 통해서 두 테이블을 이어주면 됩니다.
post 테이블에서 id가 1인 데이터의 정보를 가져오기 위해서는 user테이블에서 userid가 kim인 사람의 정보도 필요합니다.
그렇게 하기 위해서는
이렇게 비효율적으로 두 쿼리문을 작성해서 찾아내야 합니다.
서브쿼리를 이용하더라도
동적인 코딩이 가능하지만 SELECT를 두번해주어야 합니다.
jon에는 inner join과 outer join이 있습니다.
inner join은 있는 데이터끼리만 join해서 보여주는 것입니다.
쿼리문은 다음과 같습니다.
두 테이블이 합쳐져서 한번에 나오는 것을 볼 수 있습니다.
하지만 user테이블의 id가 3인 사람의 정보는 나오지 않았습니다.
post 테이블에 user_id 값이 3인 데이터가 없기 때문입니다.
post 테이블의 user_id는 출력되지 않게 하기 위해서는
이렇게 수정하면 됩니다.
두 테이블의 id가 헷갈린다면
이렇게 수정해주면 됩니다.
이제 outer join에 대해서 알아보겠습니다.
outer join에는 left outer join 과 right outer join이 있습니다.
left outer join은 왼쪽의 테이블에 대한 정보가 다 나오는 것이고 right outer join은 오른쪽의 테이블 정보가 다 나오는 것입니다.
left outer join의 쿼리문은 다음과 같습니다.
이렇게 user 테이블의 id가 3인 데이터도 함께 나오는 것을 볼 수 있습니다.
right outer join의 쿼리문은 다음과 같습니다.
만약 left outer join이나 right outer join에서 테이블 순서를 바꾸면 데이터가 다 나오지 않기 때문에 테이블 순서를 잘 선택해주어야합니다.
'웹개발 > Springboot' 카테고리의 다른 글
DB 데이터 활용하기 - jpa 테이블 join (0) | 2021.07.04 |
---|---|
[블로그 만들기] DB 활용하기 - 로그인, 로그아웃 (0) | 2021.07.03 |
[블로그 만들기] DB 데이터 활용하기 - 회원가입 (0) | 2021.07.02 |
댓글