2021. 6. 26. 17:52ㆍDev/SpringBoot
현재 개발 중인 웹애플리케이션은 프론트와 백엔드 소스가 분리되어 있다.
프론트는 Vue.js로 개발되어 있고, 백엔드는 스프링부트 기반의 자바로 되어 있다.
기존 개발인력이 모두 퇴사하고 내가 입사하게 된 경우라서, 개발인력이 나 혼자이다 보니 서버관리부터 프론트와 백엔드 개발을 혼자 작업해야 했는데, 업무량은 논외로 치고 기존 백엔드 소스를 확인해보니 큰 문제점들이 있었다.
그 중에 몇 가지를 적어보자면,
😒 Controller에 모든 비즈니스 로직 구현
다른 모든 문제점 중에서 이 부분이 제일 짜증나는 부분이었다.
컨트롤러단에 비즈니스 로직이 구현돼 있다보니, 중복된 코드가 여기저기 산재되어 있어서 기존 기능을 수정하려면 여기저기를 다 뜯어 고쳐야 하는 문제가 있었다. 서비스 클래스는 데이터를 처리하는 mapper 클래스를 연결하기 위한 용도로만 사용하고 있었다.
분명히 이전 개발자들 중에서 고급개발자도 중간에 합류하여 팀장 역할을 수행했다고 들었는데, 왜 이 부분을 그냥 놔뒀을까?
지금은 조금씩 리팩토링 하면서, 비즈니스 로직을 서비스 클래스로 옮기고 중복된 코드는 함수화하고 있는 중이다.
😒 트랜잭션 처리가 안 돼 있음
이 부분은 좀 황당했다.
몇몇 트랜잭션 처리를 빼먹을 수 있다 쳐도, 아예 트랜잭션 처리가 안 돼 있는건 대체 뭘까...
보통 복잡한 비즈니스 로직을 개발하다보면, 하나의 트랜잭션에서 데이터 update, insert, delete가 순차적으로 일어나는데, 중간에 오류가 발생하면 롤백을 통해 기존에 수정이 일어났던 데이터의 초기화를 해야 하는데 이런 부분에 대한 처리가 안 돼 있었다.
첫째, Controller 클래스에 @Transactional 어노테이션을 붙여놨다.
@Transactional 어노테이션은 Spring AOP를 이용하게 되고, AOP는 다이내믹 프록시를 기반으로 실행되는데 이 때 인터페이스가 존재해야 한다. 하지만 Controller는 인터페이스가 존재하지 않기 때문에 트랜잭션 처리가 되지 않는다. (Controller에서 트랜잭션 처리를 하려면 별도의 설정이 필요하다고 하는데, 굳이??)
그런데 이해가 안 갔던건 @Transactional 어노테이션을 붙여 놓은 것을 보면 트랜잭션 처리를 하려고 했던 것 같은데, 테스트를 통해 확인을 안 해본걸까? 아직까지 미스테리다....
둘재, 사용중인 DBMS가 MySQL인데, 테이블의 엔진이 MyISAM로 되어 있다.
MySQL에서 트랜잭션 처리를 위해서는 테이블의 엔진이 MyISAM이 아닌, InnoDB로 설정돼 있어야 한다. 나도 이 부분은 오라클만 쓰다가 처음 써보는거라 이번에 알았다. MyISAM은 보다 빠른 조회 기능을 제공하지만 트랜잭션 기능이 지원되지 않는다. 따라서, 기존에 테이블 중에서 트랜잭션 처리가 필요한 수많은 테이블들을 모두 InnoDB로 바꿔줬다.
😒 DB테이블의 ForeignKey 설정이 전혀 없음.
테이블 간의 외래키 설정이 전혀 없이 각 테이블들의 데이터가 서로를 참조하고 있다. 따라서 가장 마스터격이 되는 데이터가 삭제되도 다른 테이블에는 그 정보와 관련된 부수적인 데이터가 남아있고, 삭제되면 안되는 데이터가 삭제된다거나 하는 식이다.
이 부분은 아직도 풀어야할 숙제로 남아있다.
😒 기능별로 나눠진 클래스에 구현되지 않은 비즈니스 로직
보통은 기능별로 서비스 클래스를 분리시켜서 만든다. 예를 들면 사용자는 UserService, 포인트는 PointService, 건물은 BuildService 등이다. 또한 사용자관련 데이터 처리는 user-mapper.xml, 건물 관련 데이터 처리는 build-mapper.xml 식으로 XML 파일을 분리한다.
이런 분리가 잘 돼 있다면, 나중에 유지보수할 때 어떤 기능에 대한 수정 필요시 바로 서비스클래스로 들어가서 찾아볼 수 있어서 편하다.
그런데 기능별로 서비스 클래스는 나눠져 있기는 한데, 어느 한 클래스에 이런저런 기능을 다 짬뽕해서 구현해놓다보니, 나중에 해당 기능의 함수를 찾으려면 프론트에서 호출하는 백엔드 엔드포인트 주소부터 찾은 후 해당 컨트롤러로 가서 계속 함수를 타고타고 들어가는 식으로 찾아 봐야만 했다.
이 외에도 고칠 부분들이 많지만 일단 기본적인 부분이라고 생각하는 것 중에서 대표적인 몇 가지를 적어보았다.
다른 개발자가 내가 구현해놓은 코드를 본다고 해도 당연히 불만이 많겠지만, 위 문제점들은 기본적인 부분이기 때문에
현재 계속해서 기존 레거시 코드들은 내가 할 수 있는 범위 내에서 리팩토링 하고 있는 중이긴 하다.
좀 더 나은 개발자가 되기 위하여...
'Dev > SpringBoot' 카테고리의 다른 글
SpringSecurity 사용 시, H2 console 화면 localhost에서 연결을 거부했습니다. (0) | 2024.12.31 |
---|---|
springboot H2 database 연결 오류 "mem:testdb" not found (0) | 2023.08.10 |
스프링부트에서 JsonView 사용법 (2) | 2021.06.27 |