Showing posts with label 잡담. Show all posts
Showing posts with label 잡담. Show all posts

Tuesday, June 8, 2021

불지옥의 코딩테스트 후기

정말 오랜만에 블로그를 적어본다.

개인적인 사정으로 3월에 퇴사를 하고 이직을 준비하고 있는 와중에 지옥의 코딩테스트 경험한 이야기를 적어볼까한다.


사실 수포자 + 반전공(?)자임에도 나름 어려운 문제들을 잘(은 아니지만) 해결해 왔기에 나름 개발부심도 갖고 있었다.


그 일이 벌어지기 전까진..

아..

이직을 하기로 마음먹고 이력서를 제출했더니 제법 높은 성공률을 보였다.

카카x계열사들, 넥x, 핀테크 업계 1위 회사등 이름들으면 알만한 곳등에서 제법 서류에 합격이 많이 됐다.

유명한 만큼 지원자도 많을거고 무지한 사람들을 걸러내기 위해 가벼운(?) 코딩테스트가 앞에 있었다.

(그때까지도 그 무지한 사람이 나일줄은 몰랐다.)


모두 같은날에 통과한게 아니다 보니 순차적으로 코딩테스트를 보게 됐는데..

처음 코딩테스트를 풀면서 느낌이 왔다. 

'하. 이곳은 내가 갈곳이 아니구나'


미안하다-

끝나고 보니 절반도 풀지 못하는 초라한 성적을 보곤

'어휴 이건 이론빨이지 나같은 창의력 대장 인재에겐 어울리지 않는구먼' 이라고 생각했다.

그리고 아직 머리가 덜 말랑해졌기 때문이겠지라는 생각에 다음 코딩테스트까지 별 준비 없이 흘러갔다.

그리고 결과는 뻔하게

혐오스러운 실력을 지닌자.. 그게 나야(둠빠 둠빠 두비두바)


탈락.

그 뒤로도 탈락 탈락 탈락. 

이러다가 좋은 기회 다 놓치겠다 싶어서 부랴부랴 이곳저곳 기웃거리며 벼락 알고리즘을 공부해봤으나 단기간에 능력이 오를리가 없었다..

그렇게 결국 많은 기회들을 놓치게 됐고 내 자신을 돌아보게 됐다.


사실 전 직장에서도 아침마다 알고리즘문제를 풀긴 했지만 방법이 잘못됐던거 같다.

쉬워보이고 풀고싶은 문제만 골라 풀다보니 수준이 올라갈리 없었고 풀고나서 다른사람들 풀이를 비교해보면서 개선하려 하지 않았다.

그나마 현업에 생존(?) 할 수 있었던건 서버쪽보단 클라이언트에 가까웠고, 비지니스 로직보다는 UI/UX에 가까웠고, 비효율적으로라도 결과만 나왔으면 됐기 때문은 아니었을까 싶다.



지금이라도 차근히 잘 공부해 나가면 언젠간 나도 알고리즘을 잘 풀 날을 기대해본다.

여러분도 알고리즘 공부 꼭 하길 추천한다. (연봉숫자가 바뀝니다.)


PS) 여러 알고리즘 사이트를 돌아봤지만 개인적으로는 https://www.codewars.com 라는 사이트가 가장 맘에 들었다.(사이트에 대한 리뷰는 다음에 적어보도록 하겠다.)

Friday, April 30, 2021

블로그 새단장!



화면 깨지고 어지럽던 레이아웃들 방치하고 있다가 이번에 테마도 바꾸면서 새롭게 단장(?) 했다.
기억을 되살려서 페이징도 커스텀 하고 여러가지 위젯들도 손을 좀 봤다 이것저것 많이 귀찮을 줄 알았는데 생각보다는 빠르게 끝내서 다행이다(!)
블로그를 고치고 보니 글쓰기 의욕이 다시 생기는거 같다. 

Tuesday, September 3, 2019

LTE 끊김, '이 설정' 하나로 1분 만에 해결하는 놀라운 방법

스마트폰으로 영상을 보거나, 모바일 게임을 즐기거나, 중요한 메시지를 보내는 순간, 갑자기 인터넷 연결이 끊기며 버퍼링이 걸리거나 전송에 실패하는 경험, 누구나 한 번쯤은 겪어보셨을 겁니다. 특히 최신 5G 스마트폰을 구매했는데도 불구하고 오히려 이전 LTE(4G) 스마트폰보다 연결이 불안정하다고 느끼는 분들이 많습니다. "최신 기술이 적용된 폰인데 왜 이러지?"라는 답답함과 함께 서비스 센터 방문을 고민하게 되는 이 문제, 사실은 대부분의 경우 아주 간단한 설정 변경 하나로 해결할 수 있습니다.

이 글에서는 수많은 사용자를 괴롭히는 스마트폰 LTE 연결 끊김 현상의 근본적인 원인을 깊이 파헤치고, 단 1분 만에 이 문제를 해결할 수 있는 구체적인 방법을 삼성 갤럭시와 애플 아이폰 기종별로 상세하게 안내합니다. 더 나아가, 이 간단한 방법으로도 해결되지 않는 경우를 대비한 추가적인 고급 문제 해결 팁까지 총망라하여 여러분의 데이터 스트레스를 완전히 해소해 드리겠습니다.

1. 5G 스마트폰인데 왜 LTE가 더 끊길까? 근본 원인 분석

문제 해결에 앞서, 왜 이런 현상이 발생하는지 이해하면 앞으로 유사한 문제를 겪을 때 더 현명하게 대처할 수 있습니다. 대부분의 LTE 연결 끊김 문제는 '5G 네트워크의 특성'과 스마트폰의 '네트워크 우선순위 설정'의 조합 때문에 발생합니다.

1.1. 5G와 LTE(4G)의 기술적 차이: 속도와 안정성의 트레이드오프

우리가 흔히 사용하는 모바일 네트워크는 세대별로 특징이 뚜렷합니다.

  • 5G (5th Generation): 5G의 가장 큰 장점은 '초고속'과 '초저지연'입니다. 이론적으로 LTE보다 수십 배 빠른 속도를 제공하여 고화질 영상 스트리밍, 클라우드 게이밍 등을 끊김 없이 즐길 수 있게 해줍니다. 하지만 이러한 장점은 '주파수'의 특성에서 비롯된 단점을 동반합니다. 5G는 주로 높은 대역의 주파수(고주파)를 사용하는데, 고주파는 직진성이 강해 건물, 벽, 심지어 나무와 같은 장애물을 잘 통과하지 못하고 전파 도달 거리가 짧습니다. 즉, 속도는 매우 빠르지만 커버리지가 좁고 신호가 불안정할 수 있습니다.
  • LTE (4G, Long Term Evolution): LTE는 5G보다 낮은 주파수 대역을 주로 사용합니다. 이 주파수는 회절성이 좋아 장애물을 잘 피해가고 전파 도달 거리가 깁니다. 덕분에 전국적으로 촘촘하게 기지국이 설치되어 있어 어디서든 안정적인 연결을 제공합니다. 속도는 5G보다 느리지만, 커버리지가 매우 넓고 신호가 안정적이라는 압도적인 장점을 가집니다.

1.2. 문제의 핵심: '5G 우선 모드'의 함정

현재 출시된 대부분의 5G 스마트폰은 기본적으로 '5G 우선 모드(5G Preferred)'로 설정되어 출고됩니다. 이 설정의 의미는 다음과 같습니다.

"스마트폰아, 너는 항상 5G 신호를 최우선으로 찾아 연결해라. 만약 5G 신호가 없으면 그때서야 차선책으로 LTE에 연결해라."

이 설정은 5G 커버리지가 완벽한 도심 한복판에서는 최고의 성능을 발휘합니다. 하지만 현실은 그렇지 않습니다. 5G 커버리지는 아직 전국적으로 완벽하게 구축되지 않았으며, 건물 내부, 지하철, 외곽 지역 등 신호가 약하거나 없는 '음영 지역'이 많습니다.

바로 이 지점에서 문제가 발생합니다. 사용자가 5G 신호가 약한 경계 지역에 있을 때, 스마트폰은 '5G 우선'이라는 명령에 충실하기 위해 아주 미세하고 불안정한 5G 신호를 어떻게든 붙잡으려고 필사적으로 노력합니다. 이 약한 신호로는 정상적인 데이터 통신이 거의 불가능합니다. 결국 통신이 불가능할 정도로 신호가 약해지면 스마트폰은 그제서야 5G를 포기하고 안정적인 LTE로 전환합니다. 하지만 조금만 움직여서 다시 미세한 5G 신호가 감지되면, 스마트폰은 또다시 5G로 연결을 시도합니다.

이처럼 '불안정한 5G 접속 시도 → 연결 실패 → 안정적인 LTE로 전환 → 미세한 5G 신호 감지 → 다시 5G 접속 시도'라는 과정이 끊임없이 반복되면서 네트워크 '핸드오버(Hand-over)'가 빈번하게 발생합니다. 바로 이 전환 과정에서 순간적인 데이터 끊김, 즉 우리가 체감하는 버퍼링과 전송 실패가 일어나는 것입니다. 이는 마치 운전 중에 계속해서 더 빠른 길을 찾겠다며 좁은 골목길로 들어갔다가 막혀서 다시 큰길로 나오기를 반복하는 것과 같습니다. 차라리 처음부터 안정적인 큰길로 계속 가는 것이 훨씬 빠르고 스트레스가 없는 것과 같은 이치입니다.

2. 1분 투자로 LTE 끊김 스트레스 끝내기 (갤럭시 & 아이폰 설정법)

이제 원인을 알았으니 해결책은 간단합니다. 스마트폰에게 "불안정한 5G에 집착하지 말고, 우선 안정적인 LTE를 사용해라"라고 설정을 변경해주면 됩니다. 이 방법을 'LTE 우선 모드'로 변경한다고 하며, 대부분의 연결 끊김 문제는 이 설정 하나로 즉시 해결됩니다. 배터리 소모가 줄어드는 것은 덤입니다.

2.1. 삼성 갤럭시 (안드로이드) 사용자 설정 방법

대부분의 국내 안드로이드 스마트폰 사용자가 해당하는 경우입니다. 메뉴 명칭은 기기 제조사나 OS 버전에 따라 약간 다를 수 있지만, 경로는 거의 동일합니다.

  1. '설정' 앱 열기: 바탕화면이나 앱 서랍에서 톱니바퀴 모양의 '설정' 아이콘을 찾아 터치합니다.
  2. '연결' 메뉴 선택: 설정 메뉴 최상단에 있는 '연결' (Wi-Fi, 블루투스, 데이터 사용) 메뉴로 들어갑니다.
  3. '모바일 네트워크' 선택: '연결' 메뉴 중간쯤에 있는 '모바일 네트워크'를 선택합니다.
  4. '데이터 네트워크 방식' 선택: 이곳이 바로 핵심 설정 메뉴입니다. '데이터 네트워크 방식' 또는 '네트워크 모드'라고 표시된 항목을 터치합니다.
  5. 'LTE 우선 모드' 선택: 여러 선택지 중에서 'LTE 우선 모드' 또는 '4G/3G/2G (자동 연결)' 등으로 표시된 항목을 선택합니다. 기존에는 '5G 우선 모드'로 설정되어 있을 것입니다.
삼성 갤럭시 스마트폰에서 데이터 네트워크 방식을 LTE 우선 모드로 변경하는 설정 화면
[그림 1] 갤럭시 '데이터 네트워크 방식' 설정 화면. '5G 우선 모드'를 'LTE 우선 모드'로 변경하면 됩니다.

설정을 변경하는 즉시 상단 상태표시줄의 네트워크 아이콘이 '5G'에서 'LTE' 또는 '4G'로 바뀌는 것을 확인할 수 있습니다. 이제부터 스마트폰은 안정적인 LTE 네트워크를 우선적으로 사용하게 되어 불필요한 네트워크 전환으로 인한 끊김 현상이 현저하게 줄어들 것입니다.

2.2. 애플 아이폰 (iOS) 사용자 설정 방법

아이폰 사용자 역시 비슷한 방법으로 간단하게 설정을 변경할 수 있습니다.

  1. '설정' 앱 열기: 홈 화면에서 톱니바퀴 모양의 '설정' 앱을 실행합니다.
  2. '셀룰러' 메뉴 선택: 설정 목록에서 '셀룰러' 메뉴를 찾아 터치합니다.
  3. '셀룰러 데이터 옵션' 선택: '셀룰러' 메뉴 안에서 '셀룰러 데이터 옵션'으로 들어갑니다.
  4. '음성 및 데이터' 선택: 해당 메뉴를 터치하여 네트워크 모드 설정으로 진입합니다.
  5. 'LTE' 선택: 여기에 '5G 자동', '5G 우선', 'LTE' 세 가지 옵션이 보일 것입니다.
    • 5G 자동 (기본값): 5G가 체감 성능에 눈에 띄는 향상을 가져오지 않을 때 자동으로 LTE를 사용합니다. 애플의 방식이지만, 여전히 5G 연결을 시도하므로 불안정할 수 있습니다.
    • 5G 우선: 5G 네트워크를 항상 우선적으로 사용합니다. 배터리 소모가 커지고 연결 불안정의 주된 원인이 될 수 있습니다.
    • LTE: 5G를 완전히 비활성화하고 LTE 네트워크만 사용합니다. 연결 안정성을 최우선으로 확보하고 싶을 때 이 옵션을 선택하는 것이 가장 확실합니다.
    따라서, 연결 끊김 문제를 해결하려면 'LTE'를 선택하는 것을 강력히 권장합니다.

이 간단한 조치만으로도 대부분의 사용자는 지긋지긋한 LTE 연결 끊김 문제로부터 해방될 수 있습니다. 하지만 만약 이 방법으로도 문제가 해결되지 않는다면, 다른 원인이 있을 수 있습니다. 다음 장에서는 추가적인 해결책들을 알아보겠습니다.

3. 위 방법으로 해결되지 않을 때: 추가 고급 해결책 8가지

네트워크 모드를 'LTE 우선'으로 변경했음에도 불구하고 여전히 연결이 불안정하다면, 문제는 다른 곳에 있을 수 있습니다. 소프트웨어의 일시적인 오류, 통신사 문제, 하드웨어 문제 등 다양한 가능성을 염두에 두고 아래의 방법들을 순서대로 시도해 보시기 바랍니다.

1. 가장 기본적이면서도 강력한 해결책: 스마트폰 재부팅

전자제품 문제의 80%는 재부팅으로 해결된다는 말이 있습니다. 스마트폰을 껐다가 다시 켜는 것만으로도 메모리에 쌓인 불필요한 데이터를 정리하고, 네트워크 모듈을 포함한 시스템 프로세스를 초기화하여 꼬여있던 연결 문제를 해결할 수 있습니다. 가장 먼저 시도해 볼 가치가 있는 간단한 방법입니다.

2. 비행기 모드 ON/OFF

재부팅보다 조금 더 가벼운 방법입니다. 설정이나 빠른 설정창에서 비행기 모드를 켰다가 10~15초 정도 기다린 후 다시 끄면, 스마트폰의 모든 통신(셀룰러, Wi-Fi, 블루투스)이 비활성화되었다가 다시 활성화됩니다. 이 과정에서 스마트폰은 가까운 기지국에 새로 접속하는 절차를 밟게 되는데, 이 과정에서 잘못된 연결 정보가 초기화되어 문제가 해결될 수 있습니다.

3. SIM 카드 재장착

물리적인 접촉 불량도 원인이 될 수 있습니다. 스마트폰의 전원을 완전히 끈 상태에서 SIM 카드 트레이를 분리한 후, SIM 카드를 뺐다가 다시 정확하게 장착해 보십시오. 부드러운 천으로 SIM 카드의 금속 접촉 부분을 가볍게 닦아주는 것도 좋습니다. 미세한 먼지나 유분, 잘못된 장착으로 인한 인식 오류가 해결될 수 있습니다.

4. 네트워크 설정 재설정 (주의 필요)

이는 조금 더 강력한 소프트웨어적 해결책입니다. 이 기능은 스마트폰의 셀룰러, Wi-Fi, 블루투스, VPN 등 모든 네트워크 관련 설정을 공장 출하 상태로 되돌립니다. 연결 문제의 원인이 되는 잘못된 설정 값을 확실하게 제거할 수 있지만, 저장해 두었던 모든 Wi-Fi 비밀번호와 블루투스 페어링 기기 목록이 삭제되므로 이 점을 반드시 인지하고 진행해야 합니다.

  • 갤럭시 (안드로이드): 설정 → 일반 → 초기화 → 네트워크 설정 초기화 → 설정 초기화
  • 아이폰 (iOS): 설정 → 일반 → 전송 또는 iPhone 재설정 → 재설정 → 네트워크 설정 재설정

5. APN(Access Point Name) 설정 초기화

APN은 스마트폰이 통신사의 데이터 네트워크에 접속하기 위한 '주소'와 같은 역할을 합니다. 이 설정이 드물게 손상되거나 변경되면 데이터 접속이 불가능해질 수 있습니다. 대부분의 경우 통신사에서 자동으로 설정해주지만, 수동으로 초기화해볼 수 있습니다.

  • 갤럭시 (안드로이드): 설정 → 연결 → 모바일 네트워크 → 액세스 포인트 이름(APN) → 오른쪽 상단 메뉴(점 세 개) → 기본 설정으로 초기화

이후 스마트폰을 재부팅하면 통신사로부터 올바른 APN 값을 다시 받아옵니다.

6. 스마트폰 소프트웨어(OS) 업데이트 확인

스마트폰 제조사와 통신사는 네트워크 안정성 및 호환성 개선을 포함한 소프트웨어 업데이트를 주기적으로 배포합니다. 특히 통신과 관련된 '모뎀 펌웨어' 업데이트가 포함되는 경우가 많습니다. 사용 중인 스마트폰이 최신 소프트웨어 버전인지 확인하고, 업데이트가 있다면 즉시 설치하는 것이 좋습니다.

  • 갤럭시: 설정 → 소프트웨어 업데이트 → 다운로드 및 설치
  • 아이폰: 설정 → 일반 → 소프트웨어 업데이트

7. 특정 지역 문제인지 확인하기

문제가 항상 특정 장소(예: 집, 회사)에서만 발생한다면, 해당 지역의 통신사 기지국에 문제가 있거나 전파가 약한 '음영 지역'일 수 있습니다. 다른 장소로 이동했을 때 문제가 해결된다면, 이는 스마트폰의 문제가 아닐 가능성이 높습니다. 이 경우, 사용 중인 통신사 고객센터에 연락하여 해당 지역의 네트워크 품질 점검을 요청할 수 있습니다.

8. 최후의 수단: 통신사 고객센터 문의 및 서비스센터 방문

위의 모든 방법을 시도했음에도 불구하고 문제가 지속된다면, SIM 카드 자체의 불량, 통신사 측의 개통 정보 오류, 혹은 스마트폰 하드웨어(통신 모듈 등)의 고장일 수 있습니다. 이 단계에서는 혼자서 해결하기 어려우므로, 통신사 고객센터(114)에 연락하여 상담을 받거나 가까운 스마트폰 제조사 공식 서비스센터에 방문하여 전문가의 진단을 받아보는 것이 좋습니다.

결론: 안정성을 위한 현명한 선택, 'LTE 우선 모드'

현재 대한민국의 5G 네트워크는 계속해서 발전하고 있지만, 아직 전국 모든 곳에서 안정적인 서비스를 제공하기에는 시간이 더 필요한 과도기적 단계에 있습니다. 이런 상황에서 '5G 우선 모드'는 최상의 속도를 경험할 수 있는 잠재력을 가졌지만, 동시에 잦은 끊김이라는 스트레스를 유발하는 양날의 검과 같습니다.

따라서 대다수의 일반 사용자에게는 'LTE 우선 모드'로 설정하여 사용하는 것이 훨씬 더 쾌적하고 안정적인 스마트폰 사용 경험을 제공합니다. 이는 결코 비싼 5G 폰의 성능을 포기하는 것이 아니라, 현재의 통신 환경에 맞게 최적의 설정을 찾아 사용하는 현명한 방법입니다. 나중에 5G 커버리지가 충분히 확대되었을 때 언제든지 다시 '5G 우선 모드'로 변경하여 최고의 속도를 즐기면 됩니다.

만약 주변에 스마트폰 연결 문제로 불편을 겪는 친구나 가족이 있다면, 오늘 알게 된 이 간단한 'LTE 우선 모드' 변경 팁을 공유해 주는 것은 어떨까요? 작은 설정 변경 하나가 모두의 디지털 라이프를 한층 더 윤택하게 만들어 줄 것입니다.

Monday, April 29, 2019

앱 개발의 기로: PWA 대신 Flutter를 선택한 현실적인 이유와 미래 전망

들어가며: 왜 우리는 또다시 기술 선택의 딜레마에 빠졌는가?

소프트웨어 개발의 세계는 끊임없는 변화의 소용돌이 속에 있습니다. 특히 모바일 애플리케이션 개발 분야는 그 변화의 속도가 타의 추종을 불허합니다. 불과 10여 년 전만 해도 안드로이드와 iOS라는 두 거대한 생태계를 위해 각각 별도의 네이티브 코드를 작성하는 것이 당연시되었습니다. Java/Kotlin으로 안드로이드 앱을, Swift/Objective-C로 iOS 앱을 만드는 것은 정석과도 같았죠. 하지만 이 방식은 명백한 한계를 가지고 있었습니다. 동일한 비즈니스 로직과 UI/UX를 구현하기 위해 두 배의 시간, 두 배의 비용, 그리고 두 개의 다른 기술 스택을 유지해야 하는 두 배의 노력이 필요했습니다. 1인 개발자나 소규모 스타트업에게 이는 감당하기 어려운 부담이었고, 대기업에게도 비효율적인 자원 낭비였습니다.

이러한 시장의 요구에 부응하여 '크로스 플랫폼(Cross-Platform)'이라는 거대한 흐름이 탄생했습니다. 하나의 코드 베이스로 여러 운영체제에서 동작하는 애플리케이션을 만들겠다는 매력적인 약속은 수많은 개발자의 마음을 사로잡았습니다. 초기의 시도들이 있었고, 시간이 흘러 React Native, Xamarin, 그리고 오늘 우리가 깊이 파고들 두 주인공, PWA(Progressive Web App)Flutter가 등장하며 크로스 플랫폼 개발은 이제 변방의 기술이 아닌, 주류의 선택지 중 하나로 당당히 자리매김했습니다.

어느 날 당신에게 "안드로이드와 iOS 앱을 혼자, 혹은 최소한의 리소스로 빠르게 만들어야 한다"는 미션이 주어졌다고 상상해 봅시다. 당신의 머릿속에는 수많은 기술 스택이 스쳐 지나갈 것입니다. 이 글은 바로 그 고민의 지점에서 시작합니다. 특히 강력한 두 후보, '웹 기술의 최종 진화형'이라 불리는 PWA와 'Google이 밀어주는 차세대 UI 툴킷' Flutter 사이에서 우리가 어떤 기준으로, 왜 특정 기술을 선택해야 하는지에 대한 깊이 있는 고찰을 담고 있습니다. 이것은 단순히 두 기술의 스펙을 나열하는 비교표가 아닙니다. 실제 프로젝트를 진행하며 마주하게 될 현실적인 문제, 개발자 경험(DX), 성능의 한계, 그리고 가장 중요한 '미래 지속 가능성'이라는 관점에서 두 기술을 해부하고, 왜 최종적으로 Flutter가 더 나은 선택지가 될 수 있는지에 대한 논리적 여정을 따라가는 글이 될 것입니다.

1부: 웹의 이상(理想), PWA를 향한 기대와 현실의 벽

PWA란 무엇인가? 웹의 탈을 쓴 네이티브 앱

PWA, 즉 Progressive Web App(프로그레시브 웹 앱)은 단어 그대로 '점진적으로 개선되는 웹 앱'을 의미합니다. 그 본질은 웹사이트이지만, 사용자에게는 네이티브 앱과 유사한 경험을 제공하는 것을 목표로 하는 웹 기술의 집약체입니다. PWA의 핵심을 이루는 세 가지 기술 요소는 다음과 같습니다.

  • 서비스 워커 (Service Workers): PWA의 심장과도 같은 존재입니다. 브라우저의 메인 스레드와는 별개로 백그라운드에서 실행되는 스크립트로, 네트워크 요청을 가로채거나 캐싱 전략을 관리하고, 푸시 알림을 수신하는 등 막강한 기능을 수행합니다. 이를 통해 오프라인 상태에서도 앱의 일부 기능이 동작하고, 푸시 알림을 통해 사용자의 재방문을 유도하는 등 기존 웹사이트에서는 불가능했던 경험을 가능하게 합니다.
  • 웹 앱 매니페스트 (Web App Manifest): 앱의 이름, 아이콘, 테마 색상, 시작 URL 등 애플리케이션에 대한 메타데이터를 담고 있는 JSON 파일입니다. 브라우저는 이 매니페스트 파일을 참조하여 사용자가 웹사이트를 '홈 화면에 추가'할 때 실제 앱처럼 아이콘을 생성하고, 앱 실행 시 주소창이 없는 전체 화면 모드로 앱을 띄워주는 역할을 합니다.
  • HTTPS: PWA는 반드시 보안 연결(HTTPS)을 통해 서비스되어야 합니다. 서비스 워커가 네트워크 요청을 가로채고 수정할 수 있는 강력한 권한을 가지기 때문에, 중간자 공격(Man-in-the-middle attack)을 방지하고 사용자의 데이터를 보호하기 위한 필수적인 조치입니다.

이 세 가지 기술이 결합되어, 사용자는 별도의 앱 스토어(Google Play Store, Apple App Store)를 거치지 않고 웹사이트를 방문하여 단 한 번의 클릭으로 홈 화면에 앱처럼 추가할 수 있습니다. 업데이트 역시 웹사이트를 새로고침하는 것만으로 즉시 반영됩니다. 개발자에게는 더할 나위 없이 매력적인 시나리오입니다.

PWA의 치명적인 매력: '한 번 개발로 모든 것을'

PWA가 개발자 커뮤니티에 던진 가장 큰 화두는 '궁극의 크로스 플랫폼'이라는 비전이었습니다. 그 매력을 요약하면 다음과 같습니다.

  1. 단일 코드 베이스의 극대화: PWA는 웹 기술(HTML, CSS, JavaScript/TypeScript)을 기반으로 합니다. 이는 곧, 잘 만들어진 반응형 웹사이트 하나가 데스크톱 웹 브라우저, 모바일 웹 브라우저, 그리고 PWA로서 안드로이드와 iOS 홈 화면까지 모두 커버할 수 있다는 의미입니다. React, Vue, Angular 등 기존에 사용하던 웹 프레임워크와 생태계를 그대로 활용할 수 있어 학습 곡선이 낮고 개발 속도가 빠릅니다.
  2. 배포의 자유로움: 앱 스토어의 길고 까다로운 심사 과정을 거칠 필요가 없습니다. 웹 서버에 코드를 배포하는 순간, 전 세계 모든 사용자는 즉시 최신 버전을 사용할 수 있습니다. 이는 A/B 테스트나 긴급 버그 수정 시 엄청난 강점으로 작용합니다. 또한, '설치'라는 심리적 장벽이 낮아 초기 사용자 유입에 유리합니다.
  3. 검색 가능성과 공유의 용이성: PWA는 본질적으로 웹사이트이므로, 모든 콘텐츠가 URL을 가집니다. 이는 구글과 같은 검색 엔진에 의해 인덱싱될 수 있음을 의미하며, SEO(검색 엔진 최적화)를 통한 오가닉 트래픽 확보가 가능합니다. 또한, 특정 페이지나 기능을 담은 URL을 메시지나 SNS로 쉽게 공유할 수 있어 바이럴 마케팅에 효과적입니다.

이러한 장점들만 놓고 보면, PWA는 모든 앱 개발의 문제를 해결해 줄 은탄환(Silver Bullet)처럼 보입니다. 하지만 이 이상적인 비전 뒤에는 개발자들이 반드시 마주해야 하는 차가운 현실의 벽이 존재합니다.

이상을 가로막는 현실의 장벽들: PWA를 망설이게 하는 이유

PWA의 가장 큰 약점은 그 운명이 전적으로 브라우저 제조사, 특히 Apple과 Google의 정책에 달려 있다는 점입니다. 특히 폐쇄적인 생태계를 고수하는 Apple의 소극적인 지원은 PWA의 발목을 잡는 가장 큰 족쇄로 작용해왔습니다.

  • 'Apple의 벽' - iOS/iPadOS에서의 제한적인 지원:
    • 푸시 알림의 부재 (과거형) 및 기능 제약 (현재형): 오랫동안 iOS Safari는 웹 푸시 알림을 전혀 지원하지 않았습니다. 이는 사용자 리텐션을 위해 푸시 알림이 필수적인 대부분의 서비스에게 PWA를 선택지에서 제외시키는 결정적인 이유였습니다. 최근 iOS 16.4부터 웹 푸시 알림을 지원하기 시작했지만, 여전히 네이티브 앱처럼 백그라운드에서 자유롭게 알림을 보내는 데는 제약이 따르며, 사용자가 직접 '홈 화면에 추가'한 후에만 알림 권한을 요청할 수 있는 등 허들이 존재합니다.
    • 백그라운드 동기화의 한계: 서비스 워커를 이용한 백그라운드 동기화 기능 역시 iOS에서는 매우 제한적입니다. 안드로이드의 Chrome은 주기적인 백그라운드 동기화(Periodic Background Sync)를 지원하여 앱이 사용되지 않을 때도 주기적으로 데이터를 최신 상태로 유지할 수 있지만, iOS Safari는 이 기능을 지원하지 않아 앱을 켰을 때만 데이터 동기화가 가능합니다.
    • 저장 공간 제한: PWA가 사용할 수 있는 로컬 저장 공간은 약 50MB로 제한되며, 사용자가 일정 기간 PWA를 사용하지 않으면 운영체제가 예고 없이 캐시와 데이터를 삭제할 수 있습니다. 이는 오프라인 경험의 신뢰성을 크게 떨어뜨립니다.
    • 네이티브 기능 접근 불가: Bluetooth, NFC, Face ID/Touch ID, ARKit, 연락처 접근 등 민감하거나 고도화된 하드웨어 및 OS 기능에 대한 접근이 거의 불가능합니다. 웹 표준으로 제정된 일부 API(Geolocation, Camera 등)만 제한적으로 사용할 수 있어, 복잡한 기능을 요구하는 앱을 만들기에는 역부족입니다. PWA는 브라우저라는 '샌드박스' 안에 갇혀있는 태생적 한계를 벗어날 수 없습니다.
  • 성능과 사용자 경험(UX)의 미묘한 차이: 웹뷰나 브라우저 위에서 동작하는 PWA는 아무리 최적화를 잘해도 네이티브 코드에 비해 성능이 떨어질 수밖에 없습니다. 특히 복잡한 애니메이션, 대용량 데이터 처리, 3D 렌더링 등에서는 프레임 드랍(버벅임)이 발생하기 쉽습니다. 또한, 스크롤링, 화면 전환, 제스처 등에서 네이티브 앱이 주는 특유의 부드럽고 즉각적인 '손에 붙는 느낌'을 완벽하게 재현하기 어렵습니다. 사용자는 미묘하게 '이건 그냥 웹사이트네'라고 느끼게 되며, 이는 앱의 완성도에 대한 인식을 저하시킵니다.
  • API 파편화와 불확실성: 웹 표준은 W3C와 같은 표준화 기구에서 논의되지만, 최종적으로 각 브라우저(Chrome, Safari, Firefox 등)가 이를 구현하는 시점과 방식은 제각각입니다. 이는 'Write once, run anywhere'가 아니라 'Write once, debug everywhere'라는 악몽으로 이어질 수 있습니다. 특정 기능이 Chrome에서는 잘 동작하는데 Safari에서는 동작하지 않는 문제를 해결하기 위해 분기 처리를 하고 폴리필(Polyfill)을 찾아 헤매야 합니다. 이러한 파편화는 PWA의 가장 큰 장점인 개발 효율성을 갉아먹습니다.

결론적으로 PWA는 콘텐츠 중심의 블로그, 뉴스 사이트, 간단한 정보 제공 앱이나 앱 스토어 배포가 어려운 특정 카테고리의 앱(예: 성인용, 사행성)에는 훌륭한 대안이 될 수 있습니다. 하지만 고성능, 풍부한 사용자 경험, 다양한 하드웨어 기능 연동이 필요한 '진짜 애플리케이션'을 만들기에는 명확한 한계를 드러냅니다. 바로 이 지점에서, 우리는 새로운 대안을 찾아 나서게 됩니다.

2부: 새로운 대안, Flutter의 등장과 파괴적 혁신

PWA가 웹 기술의 점진적 진화의 산물이라면, Flutter는 크로스 플랫폼 개발의 문제를 전혀 다른 방식으로 해결하기 위해 태어난 '혁명적' 접근법에 가깝습니다. Google에 의해 2017년 처음 공개된 Flutter는 "어떤 화면에서든 아름다운 앱을 빌드하기 위한 Google의 UI 툴킷"이라고 자신을 소개합니다. 이 한 문장에는 Flutter의 모든 철학이 담겨 있습니다.

Flutter는 무엇이 다른가? - Skia, Dart, 그리고 위젯

Flutter가 다른 크로스 플랫폼 프레임워크(React Native 포함)와 구별되는 가장 근본적인 차이는 UI를 렌더링하는 방식에 있습니다. React Native가 JavaScript 코드를 통해 각 플랫폼의 네이티브 UI 컴포넌트(Android의 TextView, iOS의 UILabel 등)를 호출하여 화면을 그리는 '브릿지' 방식을 사용하는 반면, Flutter는 완전히 다른 길을 선택했습니다.

  • Skia 그래픽 엔진: Flutter는 OS가 제공하는 UI 컴포넌트를 전혀 사용하지 않습니다. 대신, 안드로이드, Chrome, Firefox 등에서 이미 수년간 검증된 강력한 2D 그래픽 렌더링 엔진인 'Skia'를 앱에 내장하여, 빈 캔버스 위에 모든 UI 요소를 직접 그립니다. 버튼, 텍스트, 슬라이더, 스위치 등 우리가 보는 모든 것은 Flutter 프레임워크가 Skia를 통해 픽셀 단위로 직접 렌더링한 결과물입니다. 이것이 바로 Flutter 앱이 안드로이드와 iOS에서 거의 픽셀 단위로 동일한 모습을 보일 수 있는 이유이며, OS 업데이트에 따라 UI가 깨질 걱정이 없는 근본적인 이유입니다.
  • Dart 언어: Flutter는 'Dart'라는 프로그래밍 언어를 사용합니다. Dart는 Google이 개발한 언어로, Flutter와 함께 다시금 주목받게 되었습니다. Dart는 두 가지 컴파일 모드를 지원하는 독특한 특징을 가집니다.
    • JIT (Just-in-Time) 컴파일: 개발 중에는 JIT 컴파일러가 작동하여 코드를 즉시 실행 가능한 형태로 변환합니다. 이는 Flutter의 가장 강력한 무기인 'Stateful Hot Reload'를 가능하게 합니다. 코드를 수정한 후 저장하면 수 초 내에 변경 사항이 앱 상태를 그대로 유지한 채로 화면에 즉시 반영됩니다. 이는 개발 사이클을 극단적으로 단축시켜 개발자 경험을 혁신적으로 개선합니다.
    • AOT (Ahead-of-Time) 컴파일: 앱을 출시하기 위해 빌드할 때는 AOT 컴파일러가 Dart 코드를 각 플랫폼(ARM, x86 등)에 맞는 고효율의 네이티브 기계어로 직접 컴파일합니다. 중간에 JavaScript 브릿지를 거치거나 해석기가 필요 없기 때문에, 네이티브 앱에 준하는 매우 빠른 실행 속도와 성능을 보장합니다.
  • "모든 것은 위젯이다 (Everything is a Widget)": Flutter의 UI 개발은 '위젯'이라는 개념을 중심으로 이루어집니다. 화면에 보이는 버튼, 텍스트뿐만 아니라 보이지 않는 레이아웃(Row, Column), 정렬(Align), 패딩(Padding)까지도 모두 위젯입니다. 개발자는 마치 레고 블록을 조립하듯, 작은 위젯들을 조합하여 더 크고 복잡한 위젯을 만들어나가는 선언형(Declarative) 방식으로 UI를 구축합니다. 이는 코드의 가독성을 높이고 UI 구조를 직관적으로 파악할 수 있게 도와줍니다.

개발자 경험(DX)의 혁명, 'Stateful Hot Reload'

앞서 언급한 'Stateful Hot Reload(상태유지 핫 리로드)'는 Flutter를 한번 경험해 본 개발자들이 가장 열광하는 기능입니다. 기존의 네이티브 개발이나 다른 크로스 플랫폼 프레임워크에서는 코드의 작은 부분을 수정하더라도 전체 앱을 다시 컴파일하고 설치하는 과정을 거쳐야 했습니다. 이는 수십 초에서 수 분까지 소요될 수 있는 지루한 작업이며, 개발의 흐름을 계속해서 끊어놓습니다. 특히 여러 단계를 거쳐야 도달할 수 있는 특정 화면의 UI를 수정할 때는 매번 그 단계를 다시 반복해야 하는 고통이 따랐습니다.

하지만 Flutter의 Hot Reload는 다릅니다. UI의 색상을 바꾸거나, 텍스트를 수정하거나, 위젯의 위치를 변경한 뒤 `Ctrl+S` (또는 `Cmd+S`)를 누르는 순간, 변경된 코드만 가상머신(VM)으로 전송되어 1~2초 내에 즉시 화면에 반영됩니다. 가장 중요한 것은 이때 앱의 현재 '상태(State)'가 그대로 유지된다는 점입니다. 예를 들어, 로그인 후 5번째 페이지의 팝업창 UI를 수정하고 싶다면, 코드를 수정하고 저장하는 즉시 그 팝업창이 열려있는 상태 그대로 UI 변경을 확인할 수 있습니다. 이는 개발자의 생산성을 최소 2~3배 이상 향상시키는 혁신적인 기능이며, 디자이너와 협업하며 실시간으로 UI를 조율하는 작업을 매우 원활하게 만들어줍니다.

PWA의 한계를 넘어서는 Flutter의 능력

Flutter는 PWA가 가졌던 태생적 한계들을 정면으로 돌파합니다.

  • 압도적인 성능과 일관된 UI/UX: AOT 컴파일을 통해 네이티브 코드로 실행되므로, 성능은 네이티브 앱과 거의 구별할 수 없을 정도로 빠릅니다. Skia 엔진이 직접 UI를 그리기 때문에 60fps(초당 프레임) 또는 120fps의 부드러운 애니메이션을 일관되게 제공합니다. 또한, Material(안드로이드 디자인) 위젯과 Cupertino(iOS 디자인) 위젯을 모두 풍부하게 제공하며, 이를 커스터마이징하여 어떤 플랫폼에서든 브랜드의 고유한 디자인을 완벽하게 구현할 수 있습니다. 'iOS에서는 이렇게 보이고, 안드로이드에서는 저렇게 보인다'는 고민 자체가 사라집니다.
  • 완벽한 네이티브 기능 접근성: Flutter는 '플랫폼 채널(Platform Channels)'이라는 명확하고 강력한 메커니즘을 제공합니다. 이를 통해 Dart 코드에서 안드로이드의 Kotlin/Java 코드나 iOS의 Swift/Objective-C 코드를 직접 호출할 수 있습니다. 이는 곧, Flutter 앱이 PWA와는 비교할 수 없는 수준으로 모든 네이티브 API와 하드웨어 기능을 100% 활용할 수 있다는 것을 의미합니다. Bluetooth, NFC, 각종 센서, 백그라운드 프로세싱, 인앱 결제 등 네이티브 앱이 할 수 있는 모든 것은 Flutter 앱도 할 수 있습니다. 필요하다면 네이티브 코드로 작성된 SDK나 라이브러리를 직접 연동하는 것도 자유롭습니다.
  • 강력하고 통일된 생태계: Dart 언어와 Flutter 프레임워크, 그리고 공식적으로 지원되는 방대한 위젯 라이브러리는 모두 Google에 의해 관리됩니다. 이는 파편화 문제를 최소화하고 일관된 개발 경험을 제공합니다. 또한, pub.dev 라는 공식 패키지 저장소에는 전 세계 개발자들이 만든 수많은 패키지(라이브러리)가 등록되어 있어, 상태 관리, 네트워크 통신, 데이터베이스 등 거의 모든 기능을 손쉽게 구현할 수 있습니다. 커뮤니티는 폭발적으로 성장하고 있으며, 이는 곧 풍부한 자료와 문제 해결의 용이성으로 이어집니다.

3부: 냉정한 비교 분석: PWA vs. Flutter, 당신의 프로젝트에 맞는 선택은?

지금까지 각 기술의 특징과 장단점을 살펴보았습니다. 이제 실제 프로젝트를 앞둔 당신의 입장에서, 어떤 기준으로 최종 선택을 내려야 할지 명확하게 정리해 보겠습니다.

평가 항목 PWA (Progressive Web App) Flutter
성능 웹뷰/브라우저 기반으로 네이티브 대비 한계 명확. 간단한 앱에는 충분하나 복잡한 애니메이션, 연산에는 불리. 네이티브 코드로 컴파일되어 거의 네이티브에 준하는 압도적인 성능. 고사양 게임을 제외한 대부분의 앱에서 성능 이슈 없음.
UI/UX 일관성 브라우저와 OS에 따라 렌더링이 미세하게 다를 수 있음. 플랫폼별 CSS 핵(hack) 필요. 네이티브 '느낌' 재현 어려움. Skia 엔진이 직접 렌더링하여 모든 플랫폼에서 픽셀 단위로 동일한 UI/UX 보장. OS 업데이트에 영향을 받지 않음.
네이티브 기능/하드웨어 접근 매우 제한적. 웹 표준 API만 사용 가능. Bluetooth, NFC, 센서 등 고급 기능 접근 불가. 특히 iOS에서 제약이 심함. 플랫폼 채널을 통해 100% 접근 가능. 네이티브 SDK 연동 자유로움. 제약 없음.
개발 속도 및 경험 (DX) 웹 개발자에게는 학습 곡선 낮음. 브라우저 개발자 도구 활용. 단, 파편화 문제로 디버깅이 어려울 수 있음. 'Stateful Hot Reload' 기능으로 압도적인 생산성. 통합된 개발 환경(VS Code, Android Studio) 및 강력한 디버깅 툴 제공.
생태계 및 커뮤니티 웹 생태계 자체는 거대하나, 'PWA'에 특화된 생태계는 상대적으로 작고 파편화됨. Google의 강력한 지원 하에 폭발적으로 성장 중. pub.dev를 중심으로 잘 정돈된 패키지 생태계 보유.
코드 베이스 활용 기존 웹사이트 코드를 거의 그대로 활용하여 앱처럼 포장 가능. 웹/앱 통합에 최적. 모바일 앱 코드를 재사용하여 웹, 데스크톱(Windows, macOS, Linux) 애플리케이션 빌드 가능 (단, Flutter for Web은 아직 성능/SEO 이슈 존재).
배포 및 설치 앱 스토어 불필요. URL만으로 접근 및 설치. 업데이트 즉시 반영. 설치 허들이 낮음. Google Play Store, Apple App Store의 심사 및 정책을 따라야 함. 일반적인 앱 배포 절차와 동일.

그래서, 최종 결론은?

  • 다음과 같은 경우 PWA를 고려해볼 수 있습니다:
    • 주요 기능이 콘텐츠를 보여주는 것(블로그, 뉴스, 매거진)인 경우.
    • 이미 잘 만들어진 반응형 웹 서비스가 있고, 이를 최소한의 노력으로 앱처럼 제공하고 싶은 경우.
    • 빠른 프로토타이핑이나 내부용 관리 도구가 필요한 경우.
    • 앱 스토어의 제약(수수료, 심사 정책)을 피해야만 하는 명확한 이유가 있는 경우.
  • 다음과 같은 경우 Flutter는 거의 항상 더 나은 선택입니다:
    • 사용자에게 고품질의 부드러운 UI/UX를 제공하는 것이 매우 중요한 경우.
    • 브랜드의 독창적인 디자인을 안드로이드와 iOS에 일관되게 적용하고 싶은 경우.
    • 카메라, GPS, 센서, 블루투스 등 다양한 하드웨어 기능을 적극적으로 활용해야 하는 경우.
    • 장기적으로 유지보수하고 확장해나갈 복잡한 비즈니스 로직을 담은 애플리케이션을 만드는 경우.
    • 단순히 '앱처럼 보이는 웹'이 아닌, '진짜 네이티브 같은 크로스 플랫폼 앱'을 목표로 하는 경우.

4부: Flutter의 미래: 모바일을 넘어 데스크톱과 웹으로

Flutter를 선택해야 하는 또 하나의 중요한 이유는 바로 그 '미래 비전'에 있습니다. Flutter는 단순히 모바일 크로스 플랫폼 프레임워크에 머무르려 하지 않습니다. Google이 그리는 큰 그림은 "어디서든 실행되는 UI를 만들기 위한 단 하나의 프레임워크"입니다.

  • Flutter for Web: Flutter는 모바일 앱을 위해 작성된 동일한 Dart 코드를 웹으로 컴파일하는 기능을 안정적으로 지원합니다. 현재 Flutter for Web은 두 가지 렌더링 모드를 제공합니다. 하나는 HTML, CSS를 활용하는 모드이고, 다른 하나는 WebAssembly와 CanvasKit(Skia의 웹 버전)을 이용해 데스크톱처럼 픽셀을 직접 그리는 모드입니다. 아직은 SEO에 불리하고 초기 로딩 속도가 느리다는 단점이 있어 일반적인 웹사이트를 대체하기는 어렵지만, 복잡한 데이터 시각화, 웹 기반의 포토 에디터, 내부 관리자용 대시보드 등 고도의 인터랙션을 요구하는 '웹 애플리케이션' 분야에서 강력한 잠재력을 보여주고 있습니다.
  • Flutter for Desktop: Flutter는 이제 Windows, macOS, Linux용 데스크톱 애플리케이션 빌드를 정식으로 지원합니다. 이미 수많은 상용 앱들이 Flutter로 만들어져 각 OS의 스토어에 배포되고 있습니다. 이는 하나의 코드 베이스로 모바일, 웹, 데스크톱까지 아우르는 진정한 '앰비언트 컴퓨팅(Ambient Computing)' 시대를 열 가능성을 보여줍니다.
  • 지속적인 성능 개선: Impeller 렌더링 엔진: Google은 Flutter의 성능을 한 단계 더 끌어올리기 위해 'Impeller'라는 새로운 렌더링 엔진을 개발하여 기본 엔진으로 채택했습니다. Impeller는 기존 Skia 엔진이 가끔 보여주던 초기 애니메이션의 미세한 버벅임(Jank) 현상을 원천적으로 해결하기 위해 설계되었습니다. 셰이더를 미리 컴파일하는 등 최신 그래픽 기술을 적용하여 어떤 상황에서도 부드러운 화면을 보장하겠다는 Google의 의지는, Flutter의 미래에 대한 강력한 신뢰를 심어줍니다.

이처럼 Flutter에 대한 Google의 투자와 비전은 확고합니다. 이는 특정 기업의 변덕에 따라 미래가 불투명해질 수 있는 PWA와는 근본적으로 다른 안정감을 제공합니다.

결론: 불확실성의 시대, 가장 확실한 선택을 향하여

기술 선택의 여정은 언제나 트레이드오프의 연속입니다. PWA가 제시했던 '웹 기술로 모든 것을'이라는 비전은 분명 매력적이었고, 지금도 특정 영역에서는 유효한 해결책입니다. 하지만 '앱'이라는 본질에 더 깊이 파고들수록, 즉, 더 나은 성능, 더 풍부한 경험, 더 넓은 기능 확장을 원할수록 PWA의 한계는 명확해집니다. 특히 플랫폼 파편화, 그중에서도 Apple의 소극적인 태도는 PWA의 미래에 드리워진 가장 큰 불확실성입니다.

반면, Flutter는 처음부터 '타협 없는 품질'을 목표로 설계되었습니다. 네이티브에 준하는 성능, 플랫폼을 초월하는 UI 일관성, 모든 네이티브 기능에 대한 완전한 접근성을 제공함으로써 PWA가 넘지 못했던 현실의 벽을 가볍게 뛰어넘었습니다. 여기에 더해, 'Stateful Hot Reload'가 선사하는 혁신적인 개발 경험과 모바일을 넘어 웹, 데스크톱으로 확장되는 명확한 미래 비전은 Flutter를 단순한 '대안'이 아닌 '가장 합리적이고 강력한 주류'의 자리에 올려놓았습니다.

결국, 1인 개발자부터 거대 기업까지, 시간과 비용의 제약 속에서 최고의 결과물을 만들어내야 하는 우리 개발자들에게 Flutter는 '가장 안전하고 확실한 투자'가 될 수 있습니다. 당신이 지금 새로운 앱 개발의 기로에 서 있다면, 주저 없이 Flutter의 세계에 발을 들여보시기를 권합니다. 거대하고 활발한 커뮤니티와 함께, 당신의 아이디어를 현실로 만드는 가장 빠른 길이 그곳에 있을 것입니다.

Thursday, August 30, 2018

블로그 리뉴얼!

미뤄왔던 블로그 템플릿 수정을 1차 완료(?) 했다.






뭔가 엉성했던 예전 블로그 템플릿에서



블링블링 화이트톤의 블로그로 재탄생!

새로운 탬플릿을 추가하면 위젯이나 기타 여러 설정들 다 다시 잡아줘야 할 줄 알았는데
템플릿만 적용하고 생각보다 쉽게(?) 커스텀이 돼서 매우 만족스럽다.
광고 끝부분이 투명하게 변하는 현상이라던가
포스팅하단에 페이지 네비게이션(pagenavi)이 없어서 조금 불편한건 나중에 시간 나면 수정 해야 겠다.

Thursday, March 22, 2018