ORM이 없는 JdbcTemplate 에서 ManyToMany 매핑관계 구현하기

msung99·2022년 12월 16일
2
post-thumbnail

사실 내용 자체가 그리 어렵지 않은 주제라서 포스팅을 할까말까 고민했습니다.
그래도 예전에 ORM 으로만 개발을하다가 ORM 없이 순수 개발을 도전해보며 다소 햇갈렸던 개념이긴해서, 다시 기억을 상기하며 제 포스팅을 보시는 분들과 내용을 공유하고자 이렇게 포스팅을 시작합니다.


시작에 앞서

지금껏 ORM 기반으로만 개발을 해보셨다면 순수 JDBC, JdbcTemplate 과 등을 기반으로 테이블 사이의 매핑관계를 구성하시려면 N:N 관계, 즉 ManyToMany 관계를 어떻게 구현할지 막막하실 수 있습니다.

예전에 저도 많이 햇갈려서 구글링을 많이 했었는데, 상세하게 알려주는 국내의 블로깅 내용이 그지 많지는 않았던 것 같네요.

지금부터 어떻게 ORM 에서 손쉽게 구현하던 ManyToMany 매핑 관계를 구현할 수 있을지에 코드 구현 예시와 함께 알아보겠습니다.

  • N:N 관계를 이해하고 계신다는 가정하에 포스팅을 진행하니, 이점 참고바랍니다.

ManyToMany

ManyToMany 를 간략히만 다시 짚고 넘어갑시다. N:N 매핑 관계를 의미하는 것으로써, ORM 에서 편리하게 매핑시킬 수 있는 관계입니다.

이미 학습을 하신 분이라면 팔로잉-팔로워 관계를 대표적인 예시로 봐왔을 것입니다. 한 사람이 여러 사람을 팔로우할 수 있고, 한 사람이 여러 사람에게 팔로우를 당할 수 있습니다. 즉, User 테이블끼리의 N:N 관계가 될 것입니다.

이러한 매핑관계가 ManyToMany 임을 저희는 알고 있습니다.


User 와 Team 테이블의 관계

앞서 ManyToMany 를 팔로잉 관계로 간단히 복습했습니다. 그런데 저희는 이 팔로잉 매핑관계는 많이 봤던 주제라서 조금 식상하니, User 와 Team 테이블을 ManyToMany 로 매핑시켜주는 관계를 생각해 보겠습니다.

테이블 이름에서 바로 알수 있듯이, 어떤 유저가 속해있는 팀 그룹을 매핑시켜줘야 하는 상황을 가정하는 것입니다. 그렇다면 저희는 아래와 같은 2가지 요소를 고려해 볼 수 있습니다.

  • User 입장에서는 본인이 속해있는 팀들에 대한 teamIdx 값이 필요하다.
  • Team 입장에서는 해당 팀에 속해있는 사람들의 userIdx 값이 필요하다.

=> 그렇다면, User 와 Team 테이블을 userIdx, teamIdx 를 가지고 중간에서 매핑시켜주는 무언가가 분명 필요할텐데..🤔

그런데 이들을 ORM 없이 어떻게 구현할까요? 그 해결법은 생각보다 간단합니다. User 와 Team 에 대한 userIdx, teamIdx 를 저장하고 있는 중간 매핑 테이블 하나를 생성해주시면 됩니다.

예를들어 위처럼 student 와 course 테이블이 있을때 이 둘을 연결시켜줄 중간 다리역할을 하는 테이블을 하나 만드는 겁니다. 즉 studentIdx 와 courseIdx 값을 저장할 테이블을 만들어주는 겁니다.

한줄요약 : 중간의 JOIN 테이블을 만들어서 N:N 매핑을 시켜줄 수 있다!


코드로 구현해보자

앞서 말씀드린 User 와 Team 을 구현하는 API 코드를 간단히만 하나 살펴보죠.

Controller

우선 아래처럼 POST 요청을 받고 팀을 생성하는 API 를 개발하는 것을 가정해봅시다.

 // team 객체와 mapping 객체를 생성
    @ResponseBody
    @PostMapping("makeTeam/{userIdx}")
    public void makeTeam(@PathVariable("userIdx") int userIdx, @RequestBody PostTeamReq postTeamReq){
        mappingService.makeTeam(userIdx, postTeamReq);
    }

Dao

그 다음으로는 DB 에 Mapping 테이블을 생성해놓고나서, 요청으로 받아온 teamIdx 와 userIdx 를 기반으로 새로운 Mapping 데이터를 하나 생성하는 코드입니다.

완전히 이해하실 필요는 없고, 저희가 짚고 넘어가야 할 핵심은 teamIdx 와 userIdx 를 기반으로 Team 와 User 테이블의 관계를 매핑시켜주는 중간의 Mapping 테이블 데이터를 생성하는 것입니다.

public void makeTeam(int userIdx, PostTeamReq postTeamReq){
        String makeTeamQuery = "insert into Team (teamName, teamImgUrl) VALUES (?, ?)";
        Object[] createTeamParams = new Object[]{postTeamReq.getTeamName(), postTeamReq.getTeamImgUrl()};
        this.jdbcTemplate.update(makeTeamQuery, createTeamParams);

        String makeMappingQuery = "insert into Mapping (teamIdx, userIdx) values (?, ?)";
        String lastInsertTeamIdxQuery = "select last_insert_id()";      // teamIdx 값 추출
        int teamIdx = this.jdbcTemplate.queryForObject(lastInsertTeamIdxQuery, int.class);

        Object[] createMappingParams = new Object[]{teamIdx, userIdx};
        this.jdbcTemplate.update(makeTeamQuery, createMappingParams); // Mapping 객체 생성
    }

마치며

저처럼 ORM 기반의 프로그래밍만을 하시다가 SQL 을 깊게 이해하고자 이런 기술스택을 사용해보시는 분들에게는 ManyToMany 구현이 다소 햇갈릴 수 있다고 생각합니다.

그렇지만 딱히 크게 어려운 내용은 아니므로, 위 내용을 읽으셨다면 감을 잡으셨으리라 믿습니다. 다 읽으셨어도 잘 이해안가시는 부분이 있다면 댓글로 편하게 남겨주시길 바랍니다.

profile
블로그 이전했습니다 🙂 : https://haon.blog

0개의 댓글