목포 최대의 조직 '팔룡회'의 두목 장세출은 재건설 반대 시위를 진압하는 용역패를 지휘하던 중 변호사 강소현과 만난다. 강소현은 시위를 탄압하는 장세출의 뺨을 때리며 일침을 놓고 장세출은 그런 강소현에게 한눈에 반해버린다. 이후 용역패는 3개월 동안 물러서게 두고 장세출은 강소현에게 계속 추파를 던지지만 강소현은 조폭 일을 아예 관두고 '좋은 사람'이 되지 않는다면 만날 이유 없다고 으름장을 놓는다.
이에 장세출은 정말로 조폭을 관두기로 선언한다. 그리고 과거 자신과 같은 건달이었지만 정의로운 정치인으로 변모했고, 현재는 물러나 자원봉사자로 식당을 운영하는 황보윤을 찾아가 가르침을 달라고 부탁한다. 황보윤은 재건설을 추진하는 최만수 의원을 막기 위해 시위 세력으로부터 국회의원 선거에 나가기로 한 참이었다. 황보윤은 장세출에게 폭력성을 떨치고 남을 돕는 인간이 되라고 말하며 그에게 식당을 맡긴다. 장세출은 어찌어찌 식당 일을 잘 해낸다. 장세출이 버스를 타고 출근하던 어느 날 목포대교에서 버스가 전복되는 사고를 당한다. 버스가 침몰하는 와중 장세출은 버스기사를 목숨 걸고 구해내고, 이는 세간에 알려져 '목포 영웅'으로 명성을 얻게 된다. 황보윤은 이런 장세출의 모습을 보고 그를 인정한다.
최만수 의원은 점점 지지율을 확보해가는 황보윤을 막기 위해, 유착 관계에 있던 조직 두목 조광춘에게 황보윤을 해꼬지하라고 지시한다. 습격당한 황보윤은 몇 개월 동안 병원에 입원한 신세가 되어 선거 출마가 불가능하게 되었고, 선거캠프는 장세출을 후보로 올린다.
장세출은 처음에는 낮은 지지율로 출발하였으나 성실한 면모와 이를 눈여겨본 노동당의 노갑순 후보의 단일화 결정으로 점차 세력을 불린다. 이를 또 다시 위협으로 여긴 최만수 의원은 조광춘을 이용해 네거티브 공세를 한다. 조광춘은 과거 자신이 저질렀던 살인사건을 장세출과 거짓으로 엮고, 강소현 변호사를 납치하는 만행을 저지른다. 그러나 장세출과 부하들의 활약으로 필리핀에 도망가 있던 황보윤 습격자들이 붙잡히고, 강소현 변호사도 구출되며 조광춘이 구속되면서 전세는 역전된다.
최만수 의원은 조폭과의 유착이 밝혀지면서 몰락하고, 장세출이 마침내 국회의원에 당선된다. 최만수 의원은 도주하려 하다가 음주운전으로 구속되면서 조광춘과 함께 유치장 신세를 진다. 장세출은 강소현 변호사와 연인이 되면서 영화가 끝난다.
강윤성 감독은 전작 《범죄도시》의 성공 후 빠르게 차기작을 기획했다. 원작 웹툰의 류경선 작가가 쓴 시나리오를 받고 '공감이 가는 이야기'라고 생각한 강 감독은 영화화를 결정하였다.[1]
영화는 주 배경이기도 한 목포시에서 80% 이상의 분량을 촬영했다. 2018년 10월 9일 크랭크인해서 목포대교, 유달산, 목포역 광장 등에 촬영이 시작되었고,[2] 이 밖에 군산시, 서울시 등에서 촬영을 끝내고 2019년 1월 12일 크랭크업하였다.[3][4] 특히 영화의 하이라이트 장면인 목포대교 버스 추락 장면은 목포대교와 영종도, 고양시 등에서 9일간을 로케이션 촬영하였다.[5]