2021년 회고 및 새해 다짐

2020년 회고 밎 새해 다짐 포스팅을 올린지 벌써 1년이 지났는데요,

밀린 업무를 처리하느라 눈코뜰새 없던 2021년 이었던것 같습니다. 중간중간 번아웃이 올 뻔한적도 있었지만 어찌어찌 극복하여 올 한 해도 잘 마무리 한 것 같습니다.

체감상으로는 시간이 몇 달 정도 밖에 지나지 않은 것 같은데 나이를 먹어갈 수록 시간이 정말 빨리 자나간다는 것을 몸소 체험하고 있는 요즘입니다.

각설하고, 작년에는 올해 Morden PHP 도입을 소망했었는데, 올해 얼마나 목표를 달성했을까요?

 

우선, Morden PHP 도입은 성공적이었습니다. 2021년 6월부터 라라벨 프레임워크 기반 백엔드 API를 설계하여 8월부터 실 서비스에 적용하기 시작했습니다.

오래된 서비스에 라라벨을 적용하는 작업은 쉽지 않았습니다. 라라벨은 기존 쿠키 방식의 세션을 사용하지 않기 때문에 레거시 세션을 연동하는 드라이버를 개발해야 했으며, 인증 드라이버 역시 라라벨의 것을 이용할 수 없어 그누보드용 인증 드라이버를 개발하여야 했습니다. 이 과정에서 에반스님이 올려주신 gnu-migration 프로젝트를 많이 참고하였습니다. (이 자리를 빌어 에반스님께 감사드립니다)

이후 주문서, 장바구니, 상품 등 주요 기능을 하나씩 라라벨 API로 이전하였습니다. 그리고 신규로 프로젝트의 대부분은 라라벨 기반 API에서 진행하였습니다.

그 결과 2021년 12월 현재 회사 서비스의 약 10% 비즈니스 로직이 Morden PHP로 구현이 되었습니다.

10% 정도라면 매우 적은 수치일 수 있겠지만, 오랜 기간 동안 유지보수가 이루어지던 서비스였고 대부분 Model 1의 낡은 코드에 기반한 서비스를 이정도로 개선했다는 것만으로 놀라운 성과라고 생각합니다.

 

대부분의 개발자는 낡은 레거시 코드를 유지보수하기 싫어합니다. 레거시 코드 기반으로 신기능을 추가하고, 유지보수를 한다는 것은 개발자 입장에서 괴로운 일이고 커리어에도 도움이 되지 않는 일입니다. 개발자 커뮤니티에는 새로 출근한 회사가 10년이 넘은 레거시 코드로 운영되는 모습을 보고 3일만에 추노했다는 도시전설(?)까지 있을 정도니 말 다한 셈입니다.

하지만, 개발자가 항상 신기술만 다루며 일을 할 수 있을까요? 아무리 최신 프레임워크와 패러다임을 이용하여 서비스를 만들었다고 해도 그 서비스로 뚜렷한 성과나 매출을 기대하기 힘들다면 기술이 아무런 소용이 없는 일입니다. 레거시 코드로 10년 이상 유지가 되었다는 것은 그 서비스의 업력과 실적이 그만큼 탄탄하다는 반증입니다.

이 글을 보시는 개발자분들께서도 레거시를 만난다면 회피하기보다는 기회를 봐서 과감하게 환경을 바꾸어 보라고 말씀을 드리고 싶습니다. 길가에 떨어진 쓰레기를 치우는 시민의식이 있다면 거리가 늘 깨끗해지듯이, 레거시를 맞닥뜨리게 되면 과감하게 개선하는 문화가 자리잡는다면 개발자들이 일하기 좀 더 편해지지 않을까요?

 

아무튼, 2022년부터는 새로운 API에 더 많은 기능을 추가하고 기존 레거시에 구현되어 있던 기능들도 마이그레이션이 진행될 예정입니다. 그렇게 된다면 저희 회사에 새로운 인원이 합류하였을 때 백엔드 구조를 이해할 필요 없이 가져다 쓰기만 하면 되기 때문에 업무 효율이 극대화되게 됩니다. 앱 개발자는 백엔드 기술에 대한 이해 필요 없이 앱 개발에만 집중할 수 있으며, 프론트엔드 개발자는 PHP나 SQL을 할 줄 몰라도 디자이너가 작업한 멋진 디자인을 프론트 기술을 활용하여 빠르게 실서비스에 적용할 수 있습니다.

탄탄한 기초 위에 멋진 건물이 지어질 수 있듯이, API가 탄탄한 기초 역할을 하여 저희 회사가 멋진 플랫폼 기업으로 성장할 수 있는 기반이 되기를 소망합니다.

Laravel API 고도화 레거시

블로그 방치

새로운 회사에 입사후 지금까지 블로그를 거의 방치해 놓았다.

가끔 기술 관련된 글도 올리고 해야 하는데 여유가 별로 없었던 듯... ㅡ,.ㅡ

얼마전에 Laravel 6.0 LTS도 출시되었는데 업데이트도 하고 기능 추가도 할 겸 블로그 손도 봐야 할 것 같다.

Blog Life Laravel

Mutators 사용 시 "laravel Trying to get property 'name' of non-object" 에러 해결법

Laravel Mutators를 이용하여 Relationships 관계에 있는 컬럼의 값을 포함하고자 하는 경우 getAttribute() Magic 메서드로 포함하고자 할 컬럼을 지정해주고 $appends 프로퍼티에 명시하여야 한다.

다음 코드는 Post 모델에 Category 모델의 name 컬럼을 Post 모델의 category_name 프로퍼티로 포함하는 예제이다.

class Post extends Model
{
    protected $appends = [
        'category_name',
    ];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function getCategoryNameAttribute()
    {
        return $this->category->name;
    }

}

하지만, 중간중간 해당하는 Category 모델이 없는 경우 (카테고리가 삭제 된 경우) "laravel Trying to get property 'name' of non-object" 에러가 발생한다.

당연히 해당 모델이 없기 때문에 $this->category는 null이 되고,  $this->user->name 프로퍼티에 접근할 수 없기 때문에 발생하는 문제이다.

이럴 경우 다음과 같이 null 여부를 체크하면 된다.

public function getCategoryNameAttribute()
{
    return $this->user !== null ? $this->user->name : null;
}

뿐만 아니라, 개발에 있어서 이와 같은 방어적 코딩을 습관화 하는 것이 좋다.

Develop Laravel Mutators Troubleshooting