Notice
Recent Posts
Recent Comments
Link
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

part5 (ch1). FindCVS UnitTest ์ฝ”๋“œ๋ฆฌ๋ทฐ (feat. Stubber) ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/ํŒจ์บ (์ดˆ๊ฒฉ์ฐจ)

part5 (ch1). FindCVS UnitTest ์ฝ”๋“œ๋ฆฌ๋ทฐ (feat. Stubber)

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2022. 2. 20. 18:08

FindCVS UnitTest ์ฝ”๋“œ๋ฆฌ๋ทฐ 

 

 

โœ… ๊ฐœ๋ฐœ์„ ์™„๋ฃŒํ–ˆ์œผ๋ฉด ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๋Š”๊ฑด ๋‹น์—ฐ.

ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์ฒ˜์Œ์œผ๋กœ XCTest์™€ ๊ด€๋ จํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ด์„œ ๋”์šฑ ์ง‘์ค‘ํ•ด์„œ ๋ณด๊ฒŒ ๋˜์—ˆ์Œ.

 

๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ๊ฐ–๊ณ  ์žˆ๋˜๋ฐ, ๋ณด๋ฉด์„œ ์–ด๋–ค ์ ์ด ๋” ๋‚˜์€์ง€ ์Šค์Šค๋กœ ๊ณ„์† ์ƒ๊ฐํ•˜๊ฒŒ ๋˜๋Š” ์‹œ๊ฐ„์ด๋ผ ์ข‹์•˜๋‹ค.

 

UIํ…Œ์ŠคํŠธ๋Š” ์ง„ํ–‰ํ•˜์ง€ ์•Š์•˜์Œ.

 

โœ… ํ…Œ์ŠคํŠธ์ฝ”๋“œ ํŒŒ์ผ ๊ตฌ์กฐ

ํŒŒ์ผ์˜ ๊ตฌ์กฐ๋„

 

๐ŸŸ  LocationInformationModelTest.swift

//
//  LocationInformationModelTest.swift
//  FindCVSTests
//
//  Created by Hamlit Jason on 2022/02/18.
//

import XCTest
import Nimble

@testable import FindCVS

class LocationInformationModelTest: XCTestCase {
    
    let stubNetwork = LocalNetworkStub()
    var doc: [KLDocument]!
    var model: LocationInformationModel!

    override func setUp() {
        // ๊ฐ€์ƒ์˜ ๋„คํŠธ์›Œํฌ ๋ชจ๋ธ์„ ์ฃผ๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.
        self.model = LocationInformationModel(localNetwork: stubNetwork)
        self.doc = cvsList
    }

    
    func testdocumentsToCellData() {
        let cellData = model.documentsToCellData(doc) // ์‹ค์ œ ๋ชจ๋ธ์˜ ๊ฐ’
        let placeName = doc.map { $0.placeName } // dummy์˜ ๊ฐ’
        let address0 = cellData[1].address// ์‹ค์ œ ๋ชจ๋ธ์˜ ๊ฐ’
        let roadAddressName = doc[1].roadAddressName // dummy์˜ ๊ฐ’
        
        // ์‹ค์ œ์™€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ์™ธ๋ถ€์˜ ๊ฐ’ ์ž์ฒด๊ฐ€ ๋‹ฌ๋ผ์ ธ์„œ๋Š” ์•ˆ๋œ๋‹ค.
        expect(cellData.map {$0.placeName}).to(
            equal(placeName),
            description: "DetailListCellData์˜ placeName์€ document์˜ PlaceName์ด๋‹ค")
        
        expect(address0).to(
            equal(roadAddressName),
            description: "KLDocument์˜ RoadAddressName์ด ๋นˆ ๊ฐ’์ด ์•„๋‹๊ฒฝ์šฐ roadAddress๊ฐ€ CellData์— ์ „๋‹ฌ๋œ๋‹ค.")
    }

}

Nimble์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, XCTAssertEqual๊ณผ ๋™์ผํ•œ ๋ฉ”์†Œ๋“œ์ด๋‹ค. 

 

 

๐ŸŸ  LocalNetworkStub.swift

//
//  LocalNetworkStub.swift
//  FindCVSTests
//
//  Created by Hamlit Jason on 2022/02/20.
//

import Foundation
import Stubber // ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ๋„ˆ๋ฌด ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์œผ๋‹ˆ๊นŒ ๊ฐ€์ƒ์˜ ๋„คํŠธ์›Œํฌ์—์„œ ์ฃผ์ž…ํ•˜๋Š”๊ฑฐ
import RxSwift

@testable import FindCVS

class LocalNetworkStub: LocalNetwork {
    // LocalNetwork ์ƒ์† ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•จ.
    override func getLocation(by mapPoint: MTMapPoint) -> Single<Result<LocationData, URLError>> {
        return Stubber.invoke(getLocation, args: mapPoint)
    }
}

Stubber๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์œผ๋‹ˆ๊นŒ ๋„คํŠธ์›Œํฌ๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

Stubber์— ๋Œ€ํ•ด์„œ๋Š” ๋”ฐ๋กœ ํฌ์ŠคํŒ…์„ ํ•ด๋ณด์ž.

 

 

๐ŸŸ  LocationInformationViewModelTests.swift

//
//  LocationInformationViewModelTests.swift
//  FindCVSTests
//
//  Created by Bo-Young PARK on 2021/09/26.
//

import XCTest
import Nimble
import RxSwift
import RxTest

@testable import FindCVS

class LocationInformationViewModelTests: XCTestCase {
    let disposeBag = DisposeBag()
    
    let stubNetwork  = LocalNetworkStub()
    var model: LocationInformationModel!
    var viewModel: LocationInformationViewModel!
    var doc: [KLDocument]!
    
    override func setUp() {
        self.model = LocationInformationModel(localNetwork: stubNetwork)
        self.viewModel = LocationInformationViewModel(model: model)
        self.doc = cvsList
    }
    
    func testSetMapCenter() {
        let scheduler = TestScheduler(initialClock: 0)
        
        //๋”๋ฏธ๋ฐ์ดํ„ฐ ์ด๋ฒคํŠธ
        let dummyDataEvent = scheduler.createHotObservable([
            .next(0, cvsList)
        ])
        
        let documentData = PublishSubject<[KLDocument]>()
        dummyDataEvent
            .subscribe(documentData)
            .disposed(by: disposeBag)
        
        //DetailList ์•„์ดํ…œ(์…€) ํƒญ ์ด๋ฒคํŠธ
        let itemSelectedEvent = scheduler.createHotObservable([
            .next(1, 0)
        ])
        
        let itemSelected = PublishSubject<Int>()
        itemSelectedEvent
            .subscribe(itemSelected)
            .disposed(by: disposeBag)
        
        let selectedItemMapPoint = itemSelected
            .withLatestFrom(documentData) { $1[0] }
            .map(model.documentToMTMapPoint)
        
        //์ตœ์ดˆ ํ˜„์žฌ ์œ„์น˜ ์ด๋ฒคํŠธ
        let initialMapPoint = MTMapPoint(geoCoord: MTMapPointGeo(latitude: Double(37.394225), longitude: Double(127.110341)))!
        let currentLocationEvent = scheduler.createHotObservable([
            .next(0, initialMapPoint)
        ])
        
        let initialCurrentLocation = PublishSubject<MTMapPoint>()
        
        currentLocationEvent
            .subscribe(initialCurrentLocation)
            .disposed(by: disposeBag)
        
        //ํ˜„์žฌ ์œ„์น˜ ๋ฒ„ํŠผ ํƒญ ์ด๋ฒคํŠธ
        let currentLocationButtonTapEvent = scheduler.createHotObservable([
            .next(2, Void()),
            .next(3, Void())
        ])
        
        let currentLocationButtonTapped = PublishSubject<Void>()
        
        currentLocationButtonTapEvent
            .subscribe(currentLocationButtonTapped)
            .disposed(by: disposeBag)
        
        let moveToCurrentLocation = currentLocationButtonTapped
            .withLatestFrom(initialCurrentLocation)
        
        // Merge
        let currentMapCenter = Observable
            .merge(
                selectedItemMapPoint,
                initialCurrentLocation.take(1),
                moveToCurrentLocation
            )
        
        let currentMapCenterObserver = scheduler.createObserver(Double.self)
        
        currentMapCenter
            .map { $0.mapPointGeo().latitude } // lat,lng ๋‘˜๋‹ค ๊ฒ€์‚ฌ ์•„๋‹ˆ๋ผ lat๋งŒ ๊ฒ€์‚ฌ
            .subscribe(currentMapCenterObserver)
            .disposed(by: disposeBag)
        
        scheduler.start()
        
        let secondMapPoint = model.documentToMTMapPoint(doc[0])
        
        expect(currentMapCenterObserver.events).to(
            equal([
                .next(0, initialMapPoint.mapPointGeo().latitude),
                .next(1, secondMapPoint.mapPointGeo().latitude),
                .next(2, initialMapPoint.mapPointGeo().latitude), // ๋‚ด์œ„์น˜๋‹ˆ๊นŒ ๊ฒฐ๊ตญ ์ตœ์ดˆ์œ„์น˜๋ž‘ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
                .next(3, initialMapPoint.mapPointGeo().latitude)
            ])
        )
    }
}

์ฃผ์„ ์ฝ์–ด๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ ์ฒœ์ฒœํžˆ ์ฝ์–ด๋ณด๊ธฐ.

๋กœ์ง ์ž์ฒด๊ฐ€ ์–ด๋ ต์ง€๋Š” ์•Š์€๋ฐ, rx๋ฅผ ์ •๋ง ๋‹ค์ฑ„๋กญ๊ฒŒ ํ™œ์šฉํ•˜๋Š”๊ฑฐ ๊ฐ™์•„์„œ ๋˜ ์ด๋ ‡๊ฒŒ ๋ฐฐ์›Œ๊ฐ ใ…Žใ…Ž

 

 

๐ŸŸ  Dummy.swift

//
//  Dummy.swift
//  FindCVSTests
//
//  Created by Bo-Young PARK on 2021/09/26.
//

import Foundation

@testable import FindCVS

var cvsList: [KLDocument] = Dummy().load("networkDummy.json")

class Dummy {
    func load<T: Decodable>(_ filename: String) -> T {
        let data: Data
        let bundle = Bundle(for: type(of: self))
        
        guard let file = bundle.url(forResource: filename, withExtension: nil) else {
            fatalError("\(filename)์„ main bundle์—์„œ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
        }
        
        do {
            data = try Data(contentsOf: file)
        } catch {
            fatalError("\(filename)์„ main bundle์—์„œ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\(error)")
        }
        
        do {
            let decoder = JSONDecoder()
            return try decoder.decode(T.self, from: data)
        } catch {
            fatalError("\(filename)์„ \(T.self)๋กœ ํŒŒ์‹ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
        }
    }
}

cvsList๋ฅผ ์ „์—ญ์œผ๋กœ ์„ค์ •ํ•ด ๋‘์–ด์„œ ์ด๊ฒƒ๋„ ์ธ์ƒ์ ์ด๋‹ค.

load<T: Decodable> ์—์„œ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๊ฑฐ ์—ฐ์Šต ๋” ํ•ด๋ณด์ž!

 

 

๐ŸŸ  networkDummy.json

[
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋ฐฑํ˜„๋™ 537",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > ์ด๋งˆํŠธ24",
        "distance": "2",
        "id": "1306112074",
        "phone": "031-622-7176",
        "place_name": "์ด๋งˆํŠธ24 RํŒ๊ต์•ŒํŒŒ๋”2ํ˜ธ์ ",
        "place_url": "http://place.map.kakao.com/1306112074",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ํŒ๊ต์—ญ๋กœ 152",
        "x": "127.110346616745",
        "y": "37.394204373845"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋ฐฑํ˜„๋™ 132-189",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > GS25",
        "distance": "74",
        "id": "16486797",
        "phone": "031-707-6410",
        "place_name": "GS25 SํŒ๊ต์—ญ์ ",
        "place_url": "http://place.map.kakao.com/16486797",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ํŒ๊ต์—ญ๋กœ ์ง€ํ•˜ 160",
        "x": "127.11079919194681",
        "y": "37.39478420869054"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋ฐฑํ˜„๋™ 530",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > ์„ธ๋ธ์ผ๋ ˆ๋ธ",
        "distance": "101",
        "id": "1003710555",
        "phone": "",
        "place_name": "์„ธ๋ธ์ผ๋ ˆ๋ธ ํŒ๊ต์•ŒํŒŒ๋ณธ์ ",
        "place_url": "http://place.map.kakao.com/1003710555",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ํŒ๊ต์—ญ๋กœ 145",
        "x": "127.109194827252",
        "y": "37.3942739207134"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋ฐฑํ˜„๋™ 535",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > ์ด๋งˆํŠธ24",
        "distance": "158",
        "id": "327879494",
        "phone": "",
        "place_name": "์ด๋งˆํŠธ24 RํŒ๊ต์•ŒํŒŒ๋”",
        "place_url": "http://place.map.kakao.com/327879494",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋ถ„๋‹น๋‚ด๊ณก๋กœ 117",
        "x": "127.112130909636",
        "y": "37.394199091245"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋ฐฑํ˜„๋™ 531",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > ์„ธ๋ธ์ผ๋ ˆ๋ธ",
        "distance": "216",
        "id": "1824252087",
        "phone": "",
        "place_name": "์„ธ๋ธ์ผ๋ ˆ๋ธ ํŒ๊ต์•ŒํŒŒ์ ",
        "place_url": "http://place.map.kakao.com/1824252087",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋Œ€์™•ํŒ๊ต๋กœ606๋ฒˆ๊ธธ 10",
        "x": "127.10903452806154",
        "y": "37.395876085264874"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ์‚ผํ‰๋™ 646",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์ ",
        "distance": "253",
        "id": "18830408",
        "phone": "031-8017-2851",
        "place_name": "์›์Šคํ† ์–ดํŽธ์˜์ ",
        "place_url": "http://place.map.kakao.com/18830408",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ํŒ๊ต์—ญ๋กœ 178",
        "x": "127.110042792158",
        "y": "37.396493252041"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ์‚ผํ‰๋™ 651",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์ ",
        "distance": "266",
        "id": "21610813",
        "phone": "031-8017-0662",
        "place_name": "์›ํƒ€์ž„ ํ•ดํ”ผํŒ๊ต์—ญ์ ",
        "place_url": "http://place.map.kakao.com/21610813",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋Œ€์™•ํŒ๊ต๋กœ606๋ฒˆ๊ธธ 39",
        "x": "127.11150407155293",
        "y": "37.396436019780545"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ์‚ผํ‰๋™ 647",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > CU",
        "distance": "274",
        "id": "19729729",
        "phone": "031-8017-6771",
        "place_name": "CU ํŒ๊ต์—ญ์ ",
        "place_url": "http://place.map.kakao.com/19729729",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋Œ€์™•ํŒ๊ต๋กœ606๋ฒˆ๊ธธ 31",
        "x": "127.11096907172671",
        "y": "37.396643758006725"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ์‚ผํ‰๋™ 741",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > CU",
        "distance": "274",
        "id": "26776001",
        "phone": "031-702-0135",
        "place_name": "CU ํŒ๊ต์›”๋“œ๋งˆํฌ์ ",
        "place_url": "http://place.map.kakao.com/26776001",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋Œ€์™•ํŒ๊ต๋กœ606๋ฒˆ๊ธธ 58",
        "x": "127.11329416621403",
        "y": "37.394998089782916"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ์‚ผํ‰๋™ 643",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > ์ด๋งˆํŠธ24",
        "distance": "327",
        "id": "1970035485",
        "phone": "070-8801-5864",
        "place_name": "์ด๋งˆํŠธ24 ํŒ๊ต์—ญ์ ",
        "place_url": "http://place.map.kakao.com/1970035485",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ํŒ๊ต์—ญ๋กœ 184",
        "x": "127.11013412793073",
        "y": "37.39716893309608"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋ฐฑํ˜„๋™ 529",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > GS25",
        "distance": "358",
        "id": "27498673",
        "phone": "",
        "place_name": "GS25 ํŒ๊ตํ—ˆ๋ธŒ์ ",
        "place_url": "http://place.map.kakao.com/27498673",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ํŒ๊ต์—ญ๋กœ 109",
        "x": "127.109027707855",
        "y": "37.3911673507558"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋ฐฑํ˜„๋™ 529",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > CU",
        "distance": "358",
        "id": "26776000",
        "phone": "031-708-4755",
        "place_name": "CU ํŒ๊ตSKํ—ˆ๋ธŒ์ ",
        "place_url": "http://place.map.kakao.com/26776000",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ํŒ๊ต์—ญ๋กœ 109",
        "x": "127.109027707855",
        "y": "37.3911673507558"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ์‚ผํ‰๋™ 661",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > GS25",
        "distance": "360",
        "id": "2137856685",
        "phone": "1644-5425",
        "place_name": "GS25 ํŒ๊ต์˜ˆ๋ฏธ์ง€์ ",
        "place_url": "http://place.map.kakao.com/2137856685",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ํŒ๊ต์—ญ๋กœ192๋ฒˆ๊ธธ 14-1",
        "x": "127.11173796948",
        "y": "37.3972809570947"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ์‚ผํ‰๋™ 655",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > ์ด๋งˆํŠธ24",
        "distance": "361",
        "id": "2141413165",
        "phone": "031-708-8334",
        "place_name": "์ด๋งˆํŠธ24 ํŒ๊ตSG์ ",
        "place_url": "http://place.map.kakao.com/2141413165",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ๋Œ€์™•ํŒ๊ต๋กœ606๋ฒˆ๊ธธ 47",
        "x": "127.1123881246",
        "y": "37.3970460753739"
    },
    {
        "address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ์‚ผํ‰๋™ 662",
        "category_group_code": "CS2",
        "category_group_name": "ํŽธ์˜์ ",
        "category_name": "๊ฐ€์ •,์ƒํ™œ > ํŽธ์˜์  > GS25",
        "distance": "407",
        "id": "979082513",
        "phone": "031-781-6910",
        "place_name": "GS25 ํŒ๊ตํƒ€์›Œ์ ",
        "place_url": "http://place.map.kakao.com/979082513",
        "road_address_name": "๊ฒฝ๊ธฐ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ํŒ๊ต์—ญ๋กœ192๋ฒˆ๊ธธ 16",
        "x": "127.11141235322867",
        "y": "37.39779845058796"
    }
]

JSON ์˜ˆ์‹œ ๋ฐ์ดํ„ฐ

Comments