ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SpringBoot] Converter를 사용한 사용자 정보 암호화 / Cascade 옵션 설정 / 모르는 개념 공부 방법
    Back-end/TIL 2022. 3. 30. 09:48

    스타트업 백엔드 인턴으로 근무하며 배운 내용을 까먹지 않기 위해 정리하는 글입니다.

     

    📌 사용자 정보 암호화

    회사의 데이터베이스에는 사용자에 대한 정보(이름, 전화번호 등)가 암호화되어 저장되어 있었다.

    팀장님께 여쭤보니 데이터 포털 사이트에 가면 사용자 정보 암호화 관련 법률이 있어서 그것을 따라야 한다고 말씀해주셨다.

     

    ▶️ 사용자 정보를 암호화하여 데이터베이스에 저장하는 방식

    A. javax.persistence.AttributeConverter 인터페이스를 구현한 클래스를 생성 & 해당 클래스를 @Convert로 지정

    import javax.persistence.AttributeConverter;
    import javax.persistence.Convert;
    
    @Convert
    public class StringCryptoUniqueConverter implements AttributeConverter<String, String> {
    	...
        @Override
        public String convertToDatabaseColumn(String attribute) {
    
            인코딩 기능 구현...
    
            return encodedData;
        }
    
        @Override
        public String convertToEntityAttribute(String dbData) {
    
            디코딩 기능 구현...
    
            return decodedData;
        }
    }

    B. Entity의 특정 필드들에 @Convert(converter = {클래스명}.class)를 사용해 인코딩과 디코딩 시킴

    public class Account extends BaseEntity {
    	...
        
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(nullable = false, unique = true, length = 320)
        @Convert(converter = StringCryptoUniqueConverter.class)
        private String uid;
    
        @Column(nullable = false, length = 100)
        @Convert(converter = StringCryptoUniqueConverter.class)
        private String name;
    
        @Column(nullable = false, length = 20)
        @Convert(converter = StringCryptoUniqueConverter.class)
        private String phoneNumber;
    
      	... 
      }

     

    📌 Entity의 Cascade 옵션 설정

    업무 중 특정 Entity를 삭제하는 기능을 추가하였는데, 이때 양방향 관계로 연결되어 있는 Entity들간의 Cascade 옵션이 설정되어 있지 않아 foreign key constraint error가 발생하여 FK로 연결되어있는 중개 테이블들의 데이터들을 먼저 삭제해주도록 하였다.

     

    기존에 Django를 사용해 개인 프로젝트를 할 때는 모두 Cascade를 설정해두어 바로 삭제를 하였지만, 이번에는 옵션이 설정되어 있지 않아 Cascade에 대해 고민해보고 팀장님께 여쭤보는 계기가 되었다.

     

    ▶️ Spring Boot에서의 Cascade 옵션 설정 방법

    Cascade 옵션은 Entity의 상태 변화를 전파시키는 옵션으로, OneToMany와 ManyToOne로 양방향 관계를 맺는 엔티티의 상태 변화를 전이시킬 때 사용한다.

    @Target({METHOD, FIELD}) 
    @Retention(RUNTIME)
    
    public @interface ManyToOne {
    	...
        
        /**
         * (Optional) The operations that must be cascaded to 
         * the target of the association.
         *
         * <p> By default no operations are cascaded.
         */
        CascadeType[] cascade() default {};
        
        ...
    }

    ManyToOne과 OneToMany 인터페이스에 선언된 cascade 메서드를 보면 default는 아무 설정이 없는 경우이다.

    @OneToMany(mappedBy = "account", cascade = [CascadeType.REMOVE, ..])
    private List<UserTerms> userTerms = new ArrayList<>();

    위와 같이 Entity의 필드에 옵션으로 추가가 가능하다.

     

    ▶️ Cascade를 사용하는 것이 좋을까

    이와 관련하여 팀장님께 여쭤보니 회사마다 다르고, Entity간의 연관 관계에 따라 다르다고 하셨다.

    회사 코드에서 Cascade가 설정되어 있는 부분은 Account인데, 그 이유는 연관된 Entity들의 생명주기가 명확히 하나의 사이클로 구분되기 때문에 설정하셨다고 한다. (사용자가 삭제되면 사용자 관련 데이터가 모두 삭제되는 것이니까)

     

    📌 번외 - 모르는 개념 공부 방법

    이번에 Querydsl을 사용한 동적 쿼리 구현을 하게 되어서 처음에는 아예 Querydsl의 자세한 개념부터 완벽히 공부하고 기능 구현을 하려 했지만, 정해진 기간도 있기에 비효율적이라는 생각이 들었다. 따라서 기존에 작성되어 있던 코드를 보고 공부하고, 구현을 하게되었다. 이를 경험하며 팀장님께 모르는 개념이 필요한 기능 구현 업무를 하실 때 어떻게 공부하고 하시는지 여쭤보았다.

     

    팀장님의 답변은 우선, 모든 개념을 100% 알기는 어려우니, 만약 다른 사람이 구현해놓은 것이 있다면, 해당 코드를 보고 분석하고 모르는 것은 그 분께 여쭤보거나 직접 찾아보신다고 하셨다. 

    또한, 중요한 부분은 '하고자 하는 것이 무엇인지 명확히 파악'하고, '필요한 공부를 하는 것'이라고 말씀해주셨다. 예를 들어, 동적 쿼리 구현을 위해 Querydsl이 필요한 것이므로, Querydsl의 동적 쿼리 작성 방식에 대해 공부하면 되는 것이다.

     

    처음부터 완벽하게 알 수는 없으니, 필요할 때 개념을 찾아 공부하면 된다는 의미가 무엇인지 이번 업무를 통해 알게 되었다.

    댓글

Designed by Tistory.