여러분이 식당의 웨이터라고 생각해 봅시다. 장사가 꽤 잘되는 식당이라 손님들이 슬슬 들어 옵니다. 자 그럼 이제 주문을 받으러 가야 할 것입니다. 그런데 첫 번째 손님에게 주문을 받고 이를 한 요리사에게 주문에 맞는 요리를 요청합니다. 그리고 요리가 나올 때까지 기다립니다. 1, 2, .. 10분 그리고 요리가 나오면 첫 번째 손님에게 요리를 드리고 두 번째 손님의 주문을 받습니다


 그런데 이렇게 주문을 받고 요리를 전달하니 너무나 비효율적입니다. 이렇게 일하다가는 바로 짤릴겁니다. 여러분들도 느끼셨을 테지만 요리사가 요리를 할 때 기다릴 필요가 없기 때문입니다. 그러면 어떻게 하면 될까요? 첫 번째 손님에게 주문을 받고 한 요리사에게 요리를 해달라고 요청합니다. 그리고 두 번째 손님의 주문을 받고 다른 한 요리사에게 요리를 해달라고 요청합니다. 이런 식으로 10명의 손님의 주문을 받았다고 가정해 봅시다. 그리고 어떤 요리사에게 요청했는지 표를 가지고 있습니다. 그리고 나서 표를 보고 요리사 1번부터 10번까지 한 명씩 돌면서 요리사님! 요리가 다 끝났나요?” 라고 물어보는 겁니다. “아직!”이라는 답변이 온다면 다음 요리사에게 갑니다. 이렇게 10명의 요리사를 순서대로 돌면서 물어봅니다. 그러다가 요리가 다 끝났다!” 라고 말하는 요리사의 음식을 고객에게 드리면 됩니다.



 그런데 이것 역시 효율적이지 못합니다. 이렇게 일했다가는 요리사들에게 미친놈 소리를 들을 수도 있고 아마 지쳐서 나가 떨어질 것입니다. 그럼 다른 방법이 없을까요? 요리사에게 이렇게 요청하는 겁니다. “요리사님 요리가 다 끝나면 종을 쳐주세요.” 라고 말이죠. 그러면 요리사는 요리가 끝나는 대로 종을 칠 것이고 거기로 가서 음식을 고객에게 전달하면 될 것입니다.



이것이 바로 Blocking(블록킹) I/O 모델, Non-blocking(넌블록킹) I/O 모델, Asynchronous(비동기) I/O 모델 개념입니다. Application(프로그램)I/O를 처리하지 못합니다. 마치 웨이터가 음식을 만들 수 없는 것처럼 말이죠. 그래서 Kernel에게 요청을 해야 합니다. 그리고 만약 kernel에서 I/O처리를 마칠 때까지 Application에서 기다리면 이것이 Blocking I/O 입니다.



 하지만 이것은 이 방법은 너무나 비효율적임을 우리는 봤습니다. 그래서 넌블록킹 함수를 호출하면 넌블록킹 함수는 바로 리턴을 해줍니다. 그런 다음 코드상에서는 루프(loop)를 돌면서 작업이 모두 끝났는지 물어봅니다. 만약 끝나지 않았다면 에러 값을 리턴합니다. ! 아직 작업이 끝나지 않았을 때의 에러 리턴 값이 다릅니다. 그리고 작업이 모두 끝났을 땐 그에 맞는 처리를 해주면 됩니다. 하지만 여기에는 busy waiting이 생겨서 CPU 점유율을 많이 차지하게 될 것입니다. 그래서 loop 마다 sleep 을 해주어야 합니다

참고로 멀티쓰레드를 공부해 보셨던 분들은 멀티쓰레드로 처리하면 되지 않나요? 라고 질문할 수 있습니다. 네 맞습니다. 멀티쓰레드를 사용해도 됩니다. 다만 요청이 많아 지면 content swiching이 빈번하게 발생하게 되고 이 역시 성능을 떨어트리는 요인이 됩니다.



 그렇다면 비동기 처리는 어떻게 되는 것일까요? 넌블록킹과는 다르게 kernel에 요청을 한 뒤 끝나면 어떤 것을 하라고 하는 event 혹은 callback 함수를 등록합니다. 그러면 넌블록킹처럼 지속적으로 검사를 하는 것이 아니라 작업이 끝나는 대로 등록된 event 혹은 callback 함수가 호출 됩니다. 마치 요리가 끝나면 벨을 눌러줬던 것처럼 말이죠


중국. 이 글을 읽고 있는 여러분은 무엇이 느껴지는가? 넓은 땅, 수 많은 인구, 그리고 넘쳐나는 기회. 지금 하고 있는 프로젝트가 중국을 겨냥한 서비스이다. 그 전에도 중국에서 서비스하는 프로젝트를 한 번 해봤지만 그때는 단순 소켓 통신만 하면 됐었기 때문에 복잡하지 않았는데 이번엔 달랐다. 중국은 엄청난 기회의 땅이지만 넘어야 할 벽이 너무나도 많다. 그래서 내가 이번 프로젝트에서 경험했던 것들을 공유 해보려고 한다. 이제 막 중국을 대상으로 하는 서비스를 진행한다면 조금이나마 도움이 되었으면 좋겠다.

 

중국에 아는 사람이 없어요? 아이고


 이번 프로젝트를 하면서 중국에 아는 사람이 하나도 없다면 어땠을까?’ 라는 생각을 자주 했었는데 정말 아찔하다. 그냥 있는 정도로는 안된다. 솔직히 나는 개발자 이므로 사업자 등록이나 사무실 등록이나 하는 자세한 부분은 잘 모른다. 하지만 기술적으로 중국에 아는 사람이 없을 때 겪을 수 있는 문제를 이야기 해보자.

 첫 번째는 누가 뭐래도 테스트이다. 다른 글에서도 언급했었지만 우리나라는 IT 강국인지는 잘 몰라도 인터넷 속도는 정말 빠르다. 우리의 실력이 조금 부족해도, 우리가 구현한 방식이 효율적이지 않아도 우리의 인터넷은 모든 것을 수용해 주신다. 인터넷이 되지 않는 곳이 있으면 전화 한 통이면 언제 그랬냐는 듯 인터넷이 되는 곳이 바로 우리나라이다. 하지만 중국은 다르다. 워낙 땅도 넓고 인터넷이 모두 잘 된다고 보장하지 못한다. 그런데 만약 현지에서 우리가 만든 서비스를 테스트 해보지 못한다는 건 서비스를 진행하지 못한다는 것과 같다고 할 수 있겠다.

 중국을 대상으로 하는 서비스에서 ICP 비안을 한 번쯤 들어봤을 것이다. 만약 들어보지 못했다면 꼭 알아야 하는 대상이다. 이 글에서 좀 더 자세히 다루겠지만 ICP 비안이 있고 없고는 중국에서 IT 서비스를 할 수 있는 범위가 달라진다. 이것이 중국에게 있어 외국인에게는 발급 절차도 까다롭고 빨리 나오지도 않는다. 짧아도 3개월 길게는 1년도 걸린다는 이야기를 들었다. 이제 런칭을 앞두고 있는 서비스가 ICP 비안이 필요한데 1년후에나 나온다면? 정말 아찔하지 않겠나! 이를 도와줄 현지 중국인은 정말 필수라 할 수 있다.


 




고민하지 말고 Aliyun!


 제목 그대로다. 잘 모르겠다면 Aliyun을 사용하면 된다. 지금 프로젝트 초반에 정말 고생을 많이 했다. 처음엔 아직 서비스를 하지 않을 상태여서 AWS를 사용하여 개발을 진행했다. 그나마 잘 된다고 하는 싱가포르 리전으로 개발을 진행했었다. 하지만 중국에서 테스트를 해보는 사람들은 하나 같이 느리다’, ‘영상이 나오지 않는다’, ‘이미지가 나오지 않는다등등 서비스가 정상적으로 동작 하지 않는다고 하였다.

 그때부터 여러 곳을 조사하기 시작했다. 풍문으로는 AWS(베이징 리전을 제외하고)CDNetworks를 조합해서 사용한다고 이야기도 있었다. 하지만 CDNetworks는 편하긴 하지만 가격이 조금 비쌌던 것으로 기억한다. 그러던 중 중국에 출장간 팀원이 이 사정을 중국인 개발자에게 이야기 하니 돌아온 말이 “Aliyun을 사용하는데도 그런가요?”였고 이에 아니요라고 말하니 그럼 그럴 수 있죠. Aliyun을 쓰세요.” 라는 말과 함께 안타까운 눈을 하고 있었다고 한다.

물론 한 명의 이야기가 모든 것을 대변해 주지 않는다. 그래도 중국에서 통념적으로 가지고 있는 생각인 듯 했다. 그 후 Aliyun으로 인프라 구조를 잡아나갔다. AWS를 사용해 봤다면 무난하게 사용할 수 있다. 서버 인스턴스, DB, 스토리지 서비스, CDN 모두 제공하니 일반적인 서비스라면 무난하게 Alyun으로 해결할 수 있었다. 다시 한 번 이야기 하지만 잘 모르겠다면 Aliyun부터 고려해 보자!


 




그놈의 ICP(아이 씨X의 약자인건가?!)

 

 중국에서 인터넷 사업을 하게 될 때 정말 자주 마주하게 되는 장벽은 ICP비안이다. 역으로 이것만 해결하면 정말 많은 것들이 수월하게 진행된다. 그렇다면 도대체 ICP 비안 가 무엇일까? ICP Internet Content Provider 의 약자이고 비안 이란 신청 정도가 된다. 말 그대로 인터넷 컨텐츠를 제공한다는 신청을 하는 것이다. 그래서 ICP 비안은 비경영성과 경영성으로 나뉜다. 느낌상 비경영성이 발급이 더 쉬워 보이지 않나? 맞다. 비경영성은 발급이 경영성보다는 수월한 편이다. 경영성은 회사의 규모 및 회사의 대표가 외국인(중국 기준)인지도 확인 한다고 한다. 특히 외국인은 쉽게 발급이 되지 않는다고 한다. 그래서 중국 현지의 중국인 대표가 있어야 수월해진다.

 만약 도메인을 중국에 호스팅한 서버에 연결하고 싶다면? ICP가 필요하다. 내 기억으로 Alipay를 앱이 아닌 웹사이트에서 사용하고 싶다면? ICP가 필요하다. 그 외에도 정말 많은 곳에서 ICP가 필요하다. 그런데 만약 앱으로만 하는 서비스하고 결제도 Alipay로 앱에서만 진행한다면 Aliyun으로 진행 가능했던 것으로 기억한다.(IPICP비안을 받지 않은 도메인을 바인딩하지 못한다.)

 ICP를 꼭 언급하고 싶었던 것은 처음에 개발할 당시 너무나도 고생을 많이 했기 때문이다. 다행 이도 중국 현지 중국 대표가 ICP 비안을 얻는데 많은 노력을 해서 빠른 시간 내에 얻었지만 만약 이걸 내가 했다면 어땠을까?’ 라고 생각할 때가 있는데 나였다면 타겟 시장을 바꾸자.‘라는 결론을 냈을지도 모른다. 중국시장을 노린다면 ICP부터 알고 넘어가자!

 



개발 팁팁!


중국인들중 절반이 인터넷에 접속, 모바일 네티즌 차지비율 90%넘어’. 20161월에 나온 신문 기사이다. 그리고 2014년을 기준으로 스마트폰 혹은 태블릿을 이용하는 사용자 수가 PC를 이용하는 사용자 수를 앞질렀다. 그리고 현재 중국인 직원들에게 물어보면 ‘PC는 잘 사용하지 않아요.’라는 말을 많이 들었다. 느껴지는 것이 있는가? 중국에서 개발 플랫폼의 우선순위는 앱 -> 모바일 웹 -> 웹사이트 순이라는 것이다. 만든 서비스를 많은 사람들이 이용할 수 있게 하는 것은 기본일 것이다.

 푸시는 우리가 일반적으로 사용해왔던 GCM를 사용할 수 없다. 중국에서는 Google이 안된다. 하지만 중국에는 대체 가능한 것들이 있다. 구글은 바이두, 유투브는 YOUKU TUDOU, 페이스북과 트위터는 웨이보, 위챗 정도가 되겠다. 여기서 푸시는 바이두 푸시를 이용하면 된다. 더 나아가 AWS SNS를 이용하면 좀 더 수월하게 진행할 수 있다.

 그리고 마지막으로 얼마나 중국어를 잘해야 하는지 궁금할 수 있겠다. 사람마다 개인차가 있겠지만 일단 필자는 중국어는커녕 한자도 잘 모른다. 하지만 구글 번역기와 개발자의 감(?)으로 개발을 진행했었고 지금까지 조금 버벅거린적은 있어도 막혀서 진행이 안된 적은 없었던 것 같다. 하지만 만약 회사에 중국어를 잘하는 개발자가 있다면 정말 행운이라 보면 된다.

 


나는 아직은 이런 글을 쓸 수 있을 정도로 중국 타겟으로 하는 개발의 전문가는 아니다. 지금도 모르는게 많고 아직도 개발은 진행중이며 고생하고 있다. 하지만 이제 막 중국에 서비스를 하려 첫 발을 내딛는 사람들에게 조금의 내 경험을 이야기 하고 싶었다. 중국! 기회는 많고 장벽도 많다. 무턱대고 들이대지는 말자. 철저한 준비하는 자세야 말로 중국에서 인터넷 사업하는 사람의 자세라고 말하고 싶다.

exec 나 shell_exec 를 비동기로 처리해야할 때가 있다. 그때는 명령어 뒤에 " > /dev/null 2>/dev/null &"를 붙혀주면 된다

exec("실행할 명령" . " > /dev/null 2>/dev/null &")
shell_exec("실행할 명령" . " > /dev/null 2>/dev/null &")


MySQL 에서 JOIN에 대해 알아보도록 하겠습니다.


0. JOIN 개요

SQL JOIN 이라고 검색하면 나오는 유명한(?) 그림 입니다. 일단 이 그림만 보아도 JOIN에 대한 개념을 어느정도 잡을 수 있습니다.


1. 테스트할 데이터 준비

CREATE TABLE IF NOT EXISTS `member` (
  `idx` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(50) NOT NULL,
  `username` varchar(50) NOT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `member` (`idx`, `email`, `username`) VALUES
	(1, '철수@초보끼리.com', '김철수'),
	(2, '영희@초보끼리.com', '이영희'),
	(3, '초보@초보끼리.com', '김초보');

CREATE TABLE IF NOT EXISTS `member_detail` (
  `member_idx` int(11) NOT NULL,
  `phone` varchar(50) NOT NULL,
  `nickname` varchar(50) NOT NULL,
  `thumbnail` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `member_detail` (`member_idx`, `phone`, `nickname`, `thumbnail`) VALUES
	(1, '01011121112', '철수철수', '철수.png'),
	(3, '01012341234', '초보', '초보.jpg');

CREATE TABLE IF NOT EXISTS `order_address` (
  `idx` int(11) NOT NULL AUTO_INCREMENT,
  `member_idx` int(11) NOT NULL,
  `addressee` varchar(50) NOT NULL COMMENT '수취인',
  `address` varchar(200) NOT NULL,
  `phone` varchar(50) NOT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `order_address` (`idx`, `member_idx`, `addressee`, `address`, `phone`) VALUES
	(1, 1, '김철수', '서울시 강남구 타워펠리스 지하 4층', '01011121112'),
	(2, 1, '김철수 어머니', '서울시 강남구 삐까뻔적 오피스텔 2층 201호', '01012341234'),
	(3, 2, '김초보', '뉴욕시 마봉리 페리스 오피스텔 지하 2층', '01011112222'),
	(4, 10000, '비회원', '토쿄시 나루토군 라면이오이시 닌자아파트 5층 502호', '01011112222');


2. SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.key = B.key

SELECT * FROM member AS M
LEFT JOIN member_detail AS MD ON M.idx = MD.member_idx

3. SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.key = B.key WHERE B.key IS NULL

SELECT * FROM member AS M
LEFT JOIN member_detail AS MD ON M.idx = MD.member_idx
WHERE MD.member_idx IS NULL



4. SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.key = B.key 

SELECT * FROM member AS M
RIGHT JOIN order_address AS OA ON M.idx = OA.member_idx


5. SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.key = B.key WHERE A.key IS NULL

SELECT * FROM member AS M
RIGHT JOIN order_address AS OA ON M.idx = OA.member_idx
WHERE M.idx IS NULL


6. SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.key = B.key 

SELECT * FROM member AS M
INNER JOIN member_detail AS MD ON M.idx = MD.member_idx


7. SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.key = B.key 

SELECT * FROM member AS M
LEFT JOIN order_address AS OA ON M.idx = OA.member_idx
UNION
SELECT * FROM member AS M
RIGHT JOIN order_address AS OA ON M.idx = OA.member_idx


8. SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.key = B.key WHERE A.key IS NULL OR B.key IS NULL

SELECT * FROM (
SELECT M.*, OA.addressee, OA.member_idx, OA.address, OA.phone  FROM member AS M
LEFT JOIN order_address AS OA ON M.idx = OA.member_idx
UNION
SELECT M.*, OA.addressee, OA.member_idx,  OA.address, OA.phone  FROM member AS M
RIGHT JOIN order_address AS OA ON M.idx = OA.member_idx
) AS U
WHERE U.idx IS NULL OR U.member_idx IS NULL


MySQL에서 도메인에 값들의 갯수를 세어야 할 때가 있습니다. 그럴 때 사용할 수 있는 것이 SUM과 IF의 조합입니다.


1. 테스트할 데이터 준비



CREATE TABLE IF NOT EXISTS `count_test` (
`id` int(11) NOT NULL,
`state` enum('Y','N') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `count_test` (`id`, `state`) VALUES
(1, 'Y'),
(2, 'Y'),
(3, 'Y'),
(4, 'Y'),
(5, 'N'),
(6, 'Y'),
(7, 'N'),
(8, 'Y'),
(9, 'Y'),
(10, 'N');



2. 갯수 세기(SUM, IF)


SELECT SUM(IF(state = "Y", 1, 0)) AS y_cnt, SUM(IF(state = "N", 1, 0)) AS n_cnt FROM count_test


데이터 분석 언어로 R이 주로 사용됩니다일반적으로 익숙한(?) SQL 쿼리를 R에서 어떻게 사용되는지 확인해 보겠습니다.


1. csv 파일 로드

이번 분석을 위한 샘플 CSV 파일을 로드합니다.

sample_data.csv

sample_data_2.csv

sample_data_3.csv


2. SELECT A, D

setwd("csv파일이 있는 경로")
sample.data.1 <- read.csv(file="sample_data.csv", sep=",")
sample.data.2 <- read.csv(file="sample_data_2.csv", sep=",")

3. SELECT A, D FROM table WHERE D = 1

sample.data.1[sample.data.1[,"D"] == 1,]
혹은
sample.data.1[sample.data.1[,4] == 1,]
혹은
subset(sample.data.1, D=="1")

4. UPDATE D = 5 WHERE D = 1

sample.data.1["D"][sample.data.1["D"] == 1,] <- 5


5. INSERT INTO table(A,B,C,D) VALUES(100, 200, 300, 3)

sample.data.1 <- rbind(sample.data.1, list(100,200,300,3))


6. DELETE WHERE D = 5

sample.data.1 <- sample.data.1[sample.data.1$D != 5,]


7. ORDER BY D 

sample.data.1[order(sample.data.1$D),] (ACS 방식)
sample.data.1[order(-sample.data.1$D),] (DESC 방식)
8. JOIN
merge.data <- merge(sample.data.1, sample.data.2, by="D")
merge.data <- merge(sample.data.1, sample.data.3, by.x = "D", by.y = "F")


데이터 분석 언어로 pythonpandas가 주로 사용됩니다. 일반적으로 익숙한(?) SQL 쿼리를 Pandas에서 어떻게 사용되는지 확인해 보겠습니다.


1. csv 파일 로드

이번 분석을 위한 샘플 CSV 파일을 로드합니다.

sample_data.csv

sample_data_2.csv

sample_data_3.csv


import pandas as pd 

sample_data_1 = pd.read_csv('sample_data.csv')
sample_data_2 = pd.read_csv('sample_data_2.csv')


2. SELECT A, D

sample_data_1[["A", "D"]]


3. SELECT A, D FROM table WHERE D = 1

sample_data_1[sample_data_1['D'] == 1][['A', 'D']]


4. SELECT * FROM table LIMIT 5 OFFSET 3

sample_data_1[3:3+5]


5. UPDATE D = 5 WHERE D = 1

sample_data_1.ix[sample_data_1.ix[:,'D'] == 1, "D"] = 5
혹은
sample_data_1.ix[sample_data_1.ix[:,'D'] == 1, 3] = 5


6. INSERT INTO table(A,B,C,D) VALUES(100, 200, 300, 3)

sample_data_1.loc[len(sample_data_1) +1 ] = [100, 200, 300, 3]


7. DELETE WHERE D = 5

sample_data_1 = sample_data_1[sample_data_1.D != 5]


8. ORDER BY D 

sample_data_1.sort_values(["D"], ascending=[True])
sample_data_1.sort_values(["D"], ascending=[False])

sample_data_1.sort_values(["D", "C"], ascending=[True, False])
sample_data_1.sort_values(["D", "C"], ascending=[True, True])

스키마를 엑셀에 문서화 하고 싶을 때 다음과 같이 쿼리를 생성하여 csv 혹은 엑셀로 export하여 사용하면 된다.


SELECT 
TABLE_SCHEMA, 
TABLE_NAME, 
COLUMN_NAME, 
CONCAT(DATA_TYPE,'(',IFNULL(CHARACTER_MAXIMUM_LENGTH,IFNULL(NUMERIC_PRECISION,'')),')') TYPE, 
COLUMN_KEY,
IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA NOT IN ('information_schema', 'performance_schema', 'mysql', 'isb_stg', 'isb_prd')
ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION;

curl로 html 소스 코드를 가져오려고 하는데 

http 302(redirect) 문제로 redirect된 페이지의 소스코드를 가져올 때 다음과 같이 하면 된다.


        $url = "YOUR URL";
        $res = array();
        $options = array( 
            CURLOPT_RETURNTRANSFER => true,     // return web page 
            CURLOPT_HEADER         => false,    // do not return headers 
            CURLOPT_FOLLOWLOCATION => true,     // follow redirects 
            CURLOPT_USERAGENT      => "spider", // who am i 
            CURLOPT_AUTOREFERER    => true,     // set referer on redirect 
            CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect 
            CURLOPT_TIMEOUT        => 120,      // timeout on response 
            CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects 
        ); 

        $ch      = curl_init( $url ); 
        curl_setopt_array( $ch, $options ); 
        $content = curl_exec( $ch ); 
        $err     = curl_errno( $ch ); 
        $errmsg  = curl_error( $ch ); 
        $header  = curl_getinfo( $ch ); 
        curl_close( $ch ); 

        echo $content

인테리어가 너무 이쁘죠??!!

저희는 창가 쪽에 앉았는데 창가 쪽에서 내부를 보내까 너무 이뻤습니다.


필라프와 오일 해물 스파게티 입니다. 

여기 필라프가 정말정말 환상입니다. 스파게티도 너무 맛있어요!!!


목살 스케이크 양 보세요! 맛 뿐만아니라 양도 푸짐합니다.

 달콤한 소스와 연탄불에 구운듯한 향이 너무나 좋습니다. 

샐러드와, 계란 후라이, 파인애플 각각 

스테이크와 같이 먹으면 각각 색다른 맛을 즐길 수 있습니다. 


저희가 배고프긴 했지만 양조절에 완전 실패해서 많이 남았었습니다.

커플로 오시면 목살 스테이크에 필라프 혹은 스파게티 스몰 하나! 이렇게 주문해도 충분할 거 같습니다.


+ Recent posts