🚢 JPA 의 AttributeConverter
💡 기존의 암호화 방법
우리가 프로젝트를 하다보면 사용자의 데이터를 암호화 해주어야 한다는 것을 한번쯤은 듣게 된다. 그래서 데이터를 암호화하기 위해 암호화하는 로직을 만들고 암호화를 했다면 복호화를 해야하는 로직도 만든다
문제점
- 암호화를 하는 타이밍마다 해당 로직을 구성해주어야 하고 그 타이밍마저 다 다르다
- 수정을 위한 코드에도 암호화가 들어가야한다
- 또한 사용자에게 데이터를 전달하거나 비교를 할 때 일일히 복호화 로직을 또 구해야한다는 것이다.
- 만약 코드를 누락할 경우 문제가 발생할 수 있다.
💡 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에 들어가는 데이터의 암호화를 따로 생각할 필요가 없다. 이로 인해 굉장히 복잡해질수 있는 서비스 로직을 더욱 편리하게 유지보수 할 수 있게 되고 추후에 다른 사람들이 코드를 파악할때도 어떠한 방식으로 암호화를 사용하는지 한눈에 파악할 수 있게 된다.