프로젝트/항해99 개인 프로젝트

🚢 JPA 의 AttributeConverter

늦은산책 2024. 4. 26. 10:28

💡 기존의 암호화 방법

우리가 프로젝트를 하다보면 사용자의 데이터를 암호화 해주어야 한다는 것을 한번쯤은 듣게 된다. 그래서 데이터를 암호화하기 위해 암호화하는 로직을 만들고 암호화를 했다면 복호화를 해야하는 로직도 만든다

 

문제점

  • 암호화를 하는 타이밍마다 해당 로직을 구성해주어야 하고 그 타이밍마저 다 다르다
  • 수정을 위한 코드에도 암호화가 들어가야한다
  • 또한 사용자에게 데이터를 전달하거나 비교를 할 때 일일히  복호화 로직을 또 구해야한다는 것이다.
  • 만약 코드를 누락할 경우 문제가 발생할 수 있다.

 

💡 JPA의 AttributeConverter

이 문제들을 해결하기 위해 JPA의 AttributeConverter라는 것을 이용해보려 한다. 간단하게 설명해보자면 서버에서 DB로 데이터를 넣기전과 DB에서 데이터를 불러올때 자동으로 지정해둔 암호화/복호화 로직을 사용해서 암호문제를 해결한다.

 

AttributeConverter는 제네릭 타입을 통해 전달받고 X는 Entity, Y는 DB Column 자료형을 나타낸다

 

  • Y convertToDatabaseColumn (X attribute) : DB에 요청을 전송할 때 수행한다 물론 x가 Entity이다
  • X convertToEntityAttribute(Y dbData) : Y의 DB Column을 X Entity 방식으로 전환하는 것이다.

 

이렇게 인터페이스를 이용하려는 클래스에 implement 하여 위에 보이는 두개의 메소드를 구현하면 된다.

 

💡 구현

보다시피 암호화를 사용하기 위해 Converter 클래스에 implement하여 조건을 통해 암호화와 복호화를 진행하도록 하는 방식을 볼 수 있다. 

 

Entity 도 String, dbType도 String 이기 때문에 이와 매칭되는 값만 암호화된다. 만약 String이 아닌 다른 값에 사용하기 위해서는 제네릭의 값을 변경해주어야한다.

 

  • 여기서 twoWayEncryption을 필드생성해서 사용하는데 해당 클래스가 암호화를 실제로 진행하는 로직이다.

 

💡 Converter 적용

Converter를 적용하는 방법은 어렵지 않다 하지만 Entity의 타입과 db의 타입을 잘 생각하고 진행해야 한다. int나 double과 같은 다양한 타입은 converter를 새로 만들어서 진행을 해주어야 한다. 그러면 평문이 암호화되어 진행되는 것을 볼 수 있다

 

💡 결과

이렇게 사용하면 더이상 DB에 들어가는 데이터의 암호화를 따로 생각할 필요가 없다. 이로 인해 굉장히 복잡해질수 있는 서비스 로직을 더욱 편리하게 유지보수 할 수 있게 되고 추후에 다른 사람들이 코드를 파악할때도 어떠한 방식으로 암호화를 사용하는지 한눈에 파악할 수 있게 된다.