Docker의 timezone 과 java application 의 timezone의 sync를 맞추자! 

혹은.. 서버의 timezone과 java application의 sync...

 

docker의 timezone을 설정하고, 

spring boot인 application 을 띄웠는데..

 

 

다음과 같이 localtime을 지정해주고 docker를 띄워주면

 

docker run -d -v /etc/localtime:/etc/localtime:ro

 

/ # date
Thu Mar 12 06:55:37 UTC 2020

date 명령어로 timezone이 잘 바뀐걸 확인 할 수 있다.

 

 

그런데..

spring의 log를 보면 timezone의 시간과 안맞는 것이다..

 

그래서 검색해보니 

log의 시간은 jvm의 시간을 물고가는데 

혹은, java application 단에서도 jvm의 시간을 가져오기 때문이다.

 

그래서 하단의 stack overflow를 보고 해결하였다. 한가지 옵션을 더주니 해결 되었다.

 

docker run -d -v /etc/localtime:/etc/localtime:ro -v /usr/share/zoneinfo/Asia/Seoul:/etc/timezone:ro

 

그리고 다시 재기동~ 후 확인해보니

date도, log도 모두 같은 시간인걸 확인하였다.

 

 

그런데 저 명령어가 무슨 의미가 있어서 잘되는지 알고 싶은데.. 

찾다가 정확하게 이해는 못하였다.

 

하단 github 참조

 

As I experience it, containers use their internal timezone, not the timezone of their host OS.

 

So, let's unravel this a little bit (hopefully).

  • containers share the kernel
  • the kernel tracks the "current time" (note this is "time", not "timezone"), and it is tracked simply as the "number of seconds since the epoch (1970-01-01 00:00:00 UTC)" (hence the name, "Unix Timestamp")
  • userspace (which includes tools like date) has a notion of "timezone", and it usually comes from "/etc/localtime" (but this does sometimes depends on the utility, some read "/etc/timezone" instead, and some update "/etc/localtime" from the contents of "/etc/timezone")

The Gentoo Wiki's "System time" entry also has some great information that helps untangle

 

 

저 말을 해석해보면.

컨테이너는 host OS의 timezone이 아니라 각각 내부의 timezone을 사용하고 

 

그아래 문구를 해석해보자면.. 결국 timezone은 여러군데서 읽어온다는 뜻인거 같다... 허허

 


 

 

그리고 찾다보니 docker가 아닌 서버에서도 이런 경우가 있는데 다음 블로그에 그 방법이 자세히 나와있다.

 

https://irontooth.tistory.com/47

 

java Calendar 시간과 서버시간 불일치 처리

1) Calendar runTimeCal = Calendar.getInstance(); System.out.println ("현재 타임존 : " + runTimeCal.getTimeZone().getDisplayName() ); TimeZone tz = TimeZone.getTimeZone("GMT+09:00"); runTimeCal.setTi..

irontooth.tistory.com

 

java -jar -Duser.timezone=Asia/Seoul 

해당방법처럼 매번 기동할때마다 이렇게 설정해주던가.. 아니면 start shell에 입력해주면 될거같다

아니면 

WAS에서 하는 방법도 있다.

 


 

참고 : 

 

https://stackoverflow.com/questions/34534079/how-to-sync-the-time-of-a-java-application-running-on-docker-container

 

How to sync the time of a java application running on docker container?

I am docker file like this: FROM anapsix/alpine-java:jre8 ADD service-god-sac-1.0.0-SNAPSHOT.jar app.jar ENTRYPOINT ["java", "-Xmx64m", "-XX:MaxMetaspaceSize=64m", "-jar", "/app.jar"] When I co...

stackoverflow.com

 

https://github.com/moby/moby/issues/3359

 

container timezone · Issue #3359 · moby/moby

As I experience it, containers use their internal timezone, not the timezone of their host OS. I currently work around this issue by providing a start script that takes a typezone parameter which i...

github.com

 

'DEVELOP > DevOps' 카테고리의 다른 글

내가 헷갈려서 쓰는 Git..기능  (0) 2019.07.12

Spring에서 Async처리를 해보겠다..!

 

블로그에 정리되어 있는게 많았는데 그중에 어떤 방법을 택할까 고민을 했다.

 

 

 

가장 간단한 방법으로 구현하였다.

 


 

@Async 

annotaion을 붙여주는 방법이다.

 

1. @EnableAsync로 async를 쓰겠다고 스프링에게 알린다.

2. 비동기로 수행되었으면 하는 method위에 @Async annotaion 을 붙인다.

3. method return 값은 void나 CompletableFuture<?>로 해주어야한다.

 

 

 

@EnableAsync은 Application을 run하는 데에다 붙여주거나,@Configuration annotaion 있는데 붙여주면 된다.

 

그리고 thread를 관리해주어야 하기 때문에 bean을 설정해준다.

 

@Bean
  public Executor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(2);
    executor.setMaxPoolSize(2);
    executor.setQueueCapacity(500);
    executor.setThreadNamePrefix("GithubLookup-");
    executor.initialize();
    return executor;
  }

 

spring boot 2.0이상이면, application.yml파일에 작성해도 auto configuration 으로 Excutor를 등록해준다.

 

 

이렇게해서,, 테스트를 해봤었는데 잘안되었다

 

이유는???

 

@Async를 활용하기 위해서는 몇가지 제약 조건이 있기 때문이다.

 

 

1.public method만 @Async가 가능하다. private는 불가능 
2.self-invocation(자가 호출)해서는 안된다. -> 같은 클래스 내부의 메서드를 호출하는 것은 안된다.

 

 

나같은 경우는 2번의 경우였다.

한 service에서 계속 function call을 내부적으로 하는데 

그중에 한, method만 비지니스적으로 async하게 call하고 싶었다.

 

 

그래서 찾은 방법은???

async해야 하는 method를 다른 service로 빼서 , 

기존 service에 AsyncService를 주입하고 (@Autowired)

async 해야하는 method에 @Async를 붙여준다음,

service에서 call 하면 되는 것이다 (간단간단 '-' 역시.. 알면 간단하다)

 

 

기존 service

@Service

public class 기존service{

@Autowired

AsyncService asyncService;

 

public void 해당method(){

      asyncService.asyncMethod();

   }

}

 

 

AsyncService

@Service

public class Asyncservice{

 

@Async

    ComletableFuture<OutVO>asyncMethod(){

      OutVO output = new OutVO();

 

       return ComletableFuture.completedFuture(output);

   }

}

 

 

 

그런데 도대체 왜그럴까?? ( 블로그 글 참조)

 

결론부터 말하면 AOP가 적용되어 Spring context에 등록되어 있는 빈 객체의 메서드가 호출되었을 때 스프링이 끼어들 수 있고 @Async가 적용되어 있다면 스프링이 메서드를 가로채서 다른 스레드(풀)에서 실행시켜주는 메커니즘이라는 것이다.

 

public이어야 가로챈 스프링의 다른 클래스에서 호출이 가능하고,

self-invocation이 불가능 했던 이유도 spring context에 등록된 빈의 메서드 호출 이어야

프록시를 적용 받을 수 있기에 내부 메서드 호출은 프록세 영향을 받지 않기 때문이다.

 

 

 

 

 


참고 사이트 :

https://spring.io/guides/gs/async-method/

 

Spring

Level up your Java code and explore what Spring can do for you.

spring.io

 

https://jeong-pro.tistory.com/m/187

 

How does @Async work? @Async를 지금까지 잘 못 쓰고 있었습니다(@Async 사용할 때 주의해야 할 것, 사용법)

@Async in Spring boot 스프링 부트에서 개발자에게 비동기 처리를 손쉽게 할 수 있도록 다양한 방법을 제공하고 있다. 대세는 Reactive stack, CompletableFuture를 쓰겠으나 역시 가장 쉬운 방법으로는 @Async..

jeong-pro.tistory.com

 

 

업무를 하다보니 

네트워크 기초가 부족하다는걸 절절히 느끼고

기초 책을 하나 빌려서 다보았당 '-'v(뿌듯)

 

그러니 대학교때 배웠던게 조금조금씩 기억도 나는거 같기두하구..

ㅋ_ㅋ;;

 

 

네트워크에서

OSI 7계층에 대해서 공부하고

 

데이터가 전달될때  OSI 모델에서 어떤일이 일어나나를 봐보겠다

 

 

 


 

1. OSI 계층

 

 

 

이 그림에서 OSI 계층이 무슨 일을 하는지 개략적으로 잘 보여준다.

 

1. 물리계층 (데이터 -> 전기신호 변환)

-  OSI 모델의 최하위 계층으로, 데이터를 전송하기 위해 시스템간의 물리적인 연결을 하고 전기 신호의 변호나 및 제어하는 역할 담당

- 전송 매체를 통해 데이터를 통신할 수 있는 전기적인 신호로 바꾸어 전송하는 일 수행

 

2. 데이터 링크 계층 ( MAC주소)

- 네트워크 기기 간에 데이터를 전송하고 물리주소를 결정

- 스위치( MAC 주소 테이블 )

 * 허브와 달리 데이터 충돌 발생하지 않음 

 * MAC주소 테이블이 있음 : 스위치의 포트번호와 , MAC주소가 등록되어 있는 데이터베이스

 

같은 네트워크내,,,

 

 

3. 네트워크 계층 ( 다른 네트워크와 통신 / ip)

- 다른 네트워크와 통신하기 위한 경로 설정을 위해 라우터를 통한 라우팅을 하며 패킷 전송 담당

- 라우터

 * 서로다른 네트워크를 연결해 줄는 장치

 * 현재의 네트워크에서 다른네트워크로 패킷을 전송 할 수 있다.

 

4. 전송 계층 ( 포트번호 )

- 신뢰할 수 있는 데이터를 순차적으로 전달하는 역할

- 상위 계층들이 데이터 전달의 유효성이나 효율성은 신경쓰지 않고, 데이터가 중복되거나 누락되지 않고 오류 없이 순서에 맞게 전송 되도록 관리

 

5. 응용계층 ( 서비스 제공)

- 시스템 간의 응용 처리는 상호간에 통신하면서 일련의 업무를 처리할 수 있도록 필요한 서비스 기능 제공

- 이메일 , 파일 전송, 웹 사이트 조회 등 애플리케이션에 대한 서비스 제공 

 

 

 

 

2. 데이터 전송 흐름

 

 

 

이 그림에서 컴퓨터에서 웹서버로 데이터 흐름이 이동하는데

스위치 A-> 라우터 A -> 라우터 B -> 스위치 B를 거친다.

 

스위치 A에서는 데이터 링크 계층에서 데이터를 전기신호로 변환하여 라우터 A로 전송한다.

 

라우터 A에서는 데이터 링크 계층에서 이더넷프레임의 목적지 MAC주소와 자신의 MAC주소를 비교한다.

주소가 같으면? 이더넷 헤더와 트레일러를 분리하는 역캡슐화를 수행

 

네트워크 계층에 전달해 라우팅 테이블과 목적지 IP주소를 비교한다.

현재 출발지 주소 192.168.1.10을 라우터 외부IP주소인 172.16.0.1로 변경한다.

 

라우터B에서는 외부 IP주소 172.16.0.1을 내부IP주소 192.168.10.1로 변경한다.

 

 

 

 

 

 

해당 그림은 전체 데이터 흐름의 OSI 계층을 지나가는 흐름을 그린 것이다.

 

 

 

3. OSI 계층별 캡슐화 / 역캡슐화

 

 

 

데이터를 보낼때 각계층에서 헤더를 붙여 나가는 것을 캡슐화 라고 한다.

그리고 반대로,

데이터를 수신할 대, 각 계층에서 헤더를 제거해 나가는 겻을 역캡슐화라고 한다.

 

 

각 계층에 필요한 정보를 덧붙여서 다음 계층으로 보내준다.

그리고 정보를 받을때는 해당 계층에 필요한 정보면 확인하고

맞으면 다음 계층으로 통과시키고 아니면 스탑,,

 

 

 

 


모든 사진의 출처

: 모두의 네트워크 (길벗 출판사)

 

 

 

BFS를 연습해보기 위해서 

이 문제를 풀어보았다.

 

 

 

 

 

main에서는 먼저 데이터를 map에 넣어주고

가장 중요한 것은 

해당단지마다 bfs를 돌려준다는 것이다...

 

한번에 bfs를 돌려서 전체 탐색을 하는 것이 아니라

단지마다 bfs를 돌려서

해당 단지에 집이 몇가구 있는지를

세어야 하기 때문이다.

 

그리고 몇단지인지도 세어야 하기때문에 

사실 bfs를 처음 호출되는 횟수만큼이

단지 수라고 볼 수 있겠다.

 

queue에 데이터를 관리하기 쉽게 pos에

정점 y와x를 선언해서

class를 선언해주었다.

 

 

 

그리고 가장 중요한

bfs method

 

먼저 queue에 값을 넣어주고

 

queue가 빌때까지

while문을 돌려준다.

 

그리고 d 배열 

그니깐 아래,위,오른쪽,왼쪽으로 

이동할 좌표를 입력해놓은 배열을

for를 돌면서

새로운 좌표를 구해준다

 

그게 newY, newX

 

구한 새로운 좌표값을 먼저

 

1. 경계값을 체크해준다.

( 0보다 큰지, N 보다 작은지)

2. 그리고 단지에 포함되는지를 체크한다

map[newY][newX] == 1

3. 그리고 방문한 적이 있는지? 도 체크해준다

visited[newY][newX] == fasle

 

해당 조건들이 모두 통과가 되었으면

queue에 들어갈 자격이 된닷!!

 

그렇다면 

queue에 값을 넣어주고 

방문했다고 체크해주고

그리고 단지내 가구수의 count 를 늘려준닷

 

 

그리고 해당 queue가 비면

(단지내 가구를 모두 방문했으면)

해당 단지내 가구수 가 나왔기 때문에

정답인 ArrayList에 count 배열을 넣어준다.

 

 

그리고 맨마지막에 출력할때에는

ArrayList의 수가 총 단지의 수이고

각 count가 단지내 가구 수가 된다.

 

그래서 ArrayList를 라이브러리를 

이용해 정렬해주고

 

출력해주면된다~~

 

 

 

 

 

 

 

 

 

 

'DEVELOP > ALGORITHM' 카테고리의 다른 글

Graph 최단거리 알고리즘 정리  (0) 2021.03.08
백준 2667번 단지번호 붙이기 (BFS)  (0) 2020.01.18
완전이진트리 중위 순회 문제  (0) 2020.01.16
단순 2진 암호코드  (0) 2020.01.14
View 조망권 문제  (0) 2020.01.14

 

트리를 이해하는 문제이다

이문제는 완전 이진트리를 중위 순회 하는 방법이다

 

중위 순회는 루트 노드를 중간에 읽는 방법이다

LEFT자식 -> ROOT -> RIGHT 자식

 

참고로

전위 순회 : ROOT -> LEFT -> RIGHT

후위 순회 : LEFT -> RIGHT ->ROOT

 

 

 

 

해당 문제에서 input이 이런식으로 들어오므로 input을 받을 때 주의 해야한다.

 

8
1 W 2 3
2 F 4 5
3 R 6 7
4 O 8
5 T
6 A
7 E
8 S

 

하지만 완전이진트리에서는 이걸 감안할 필요가 없다 트리에 들어가는 순서가 일정하기 때문이다.

그러므로 index와 value값만 받고 나머지는 무시해준다 ^_^;;

 

그래서 해당 tree 테이블에 해당 index값에 value값을 넣어주고

그다음 중위 순회 하는 function을 call 해준다.

 

먼저 해당 function을 나가는 조건을 명시해준다.

1. node가 tree의 수를 벗어나거나

2. tree에 값이 없다

 

 

그리고 참고로

tree는 인덱스가 0이 아닌 1부터 시작하도록 설계해주었다

완전이진 트리이므로

그리고 숫자 계산하기도 이게더 편하다.

 

 

그리고 먼저 LEFT를 먼저 뽑아줄거니깐

*2를해서 inOrder 메소드를 호출하고

그다음 출력 (ROOT)

그다음 오른쪽 자식 호출 *2+1

 

 

전위, 후위 순위는 이 출력하는 라인만 순서만 바꾸어 주면된다

 

 

다음은 input , output 파일이다.

 

 

inorder_input.txt
0.00MB
inorder_output.txt
0.00MB

'DEVELOP > ALGORITHM' 카테고리의 다른 글

백준 2667번 단지번호 붙이기 (BFS)  (0) 2020.01.18
카드교환 문제 (순열)  (0) 2020.01.17
단순 2진 암호코드  (0) 2020.01.14
View 조망권 문제  (0) 2020.01.14
KOITP 동맹의 동맹은 동맹  (0) 2018.06.12

 

이문제는 사실 이해만 하면 그닥 어렵지않다

처음에 풀었던 코드에서

좀더 성능좋게 해서 고쳐봤다

 

 

 

 

'DEVELOP > ALGORITHM' 카테고리의 다른 글

카드교환 문제 (순열)  (0) 2020.01.17
완전이진트리 중위 순회 문제  (0) 2020.01.16
View 조망권 문제  (0) 2020.01.14
KOITP 동맹의 동맹은 동맹  (0) 2018.06.12
KOITP - BFS / DFS 문제 풀기  (0) 2018.06.11

 

 

 

 

 

다음 문제를 풀어보겠다

무척 쉬운문제다 ;; 

 

 

findAns 함수가 핵심인데

 

우선 나는 한 중앙 아이를 잡고

거기서 앞뒤 1칸, 두칸의 아이들을 비교하였다

그런데, 조망권이 확보되려면 중앙 아이가 

양쪽의 아이들보다 커야 하므로,

그걸 먼저 검사해주었다 그 function이 isBig이고

 

그래서 검사하는 아이가 양쪽보다 크면 그제서야 조망권이 몇인지 체크한다.

 

조망권은 네개값 비교한것중 가장 작은 값으로 설정하면된다.

왜냐하면 하나라도 걸리면 조망권이 확보가 안되므로

 

그래서 Math.min값으로 구해주었다.

그런데 이 값은 항상 isBig이 네번 호출되므로 그닥 좋은 성능은 아닌거 같다

ㅋ_ㅋ;;

 

 

 

'DEVELOP > ALGORITHM' 카테고리의 다른 글

완전이진트리 중위 순회 문제  (0) 2020.01.16
단순 2진 암호코드  (0) 2020.01.14
KOITP 동맹의 동맹은 동맹  (0) 2018.06.12
KOITP - BFS / DFS 문제 풀기  (0) 2018.06.11
KOITP 가장 많은수 ( count sort)  (0) 2018.06.08

 

Oauth 2.0 는 무엇인가,, 알아보겠다 

이전엔 보통 open api를 이용할때 토큰을 받아와서 헤더값이 넣어주는 걸

즉, 토큰값을 받아오는걸 구현한 방식이 OAuth 라고 알고있었다

이것도 맞지만 더 자세히 알아보고자 한다 :-)

 

OAuth 2.0은 인가를 위한 프레임워크이다 

즉, 접근할 있는 권한을 주는 것이다.

 

여기서 헷갈리는 건 인증과 인가의 차이점이다.

인증은 Authentication : 본인여부를 확인 하는것  

인가는 Authorization : 서비스나 시스템에 접근 할 수 있도록 권한이 주어지는것 

 


 

OAuth 에는 네가지 역할이 있는데 그것은 다음과 같다.

4가지 실물

  1. Resource Owner (사용자,) : 서비스 이용자
  2. Client (G마켓) : 서비스 제공자
  3. Authorization Server (네이버-매표소)  : 토큰 발급 , 인가의 주체자
  4. Resource Server (네이버-검표하는곳) : 토큰 확인 , 리소스 접근심의 문지기

 

이렇게 정리 할 수 있는데,

이해할 수 있도록 설명을 덧붙이자면..

 

사용자가 G마켓이라는 서비스를 이용하고자 하는데

G마켓을 가입할때 직접 가입하지않고 요새 많이 이용하는 네이버,페이스북, 구글 ID로 로그인 하는걸 

이용해서 가입하고자 한다

 

그러면 나라는 사용자는 Resource Owner이고

사용하고자 하는 서비스는 Client G마켓이다.

 

그리고 Authorization Server는 네이버나 인증을 도와주는 곳인데 이곳에서는 토큰만 발급해준다.

그이후, 발급한 토큰을 가지고 네이버에서 원하는 정보를 가져오는데

이 토큰을 확인하는 것이 Resource Server이다.

 


Grant Type (허가 유형) 
- Client가 Authorization Server에게 토큰 발행을 요청하는 유형

 

토큰을 발행하는 과정에서 다양한 정보를 주고 받는데,

어떤 정보를 주고 받는가?를 알아보겠다

 

1. Client_id, client_secret


- Id와 pw 역할


2. Redirect_uri


- Client 가 authorization server에 토큰 발행을 요청할 때 브라우저를 아예 redirect하는
경우도 있다. 토큰을 발행하는 과정에서 client는 필요 시, 인가 되었을 타이밍에 redirect되어야 할
Uri 정보를 authorization server에게 넘겨준다.

 

3. Response_type


- Client가 authorization server에게 토큰발행 요청 했을 때, 응답을 정의 (request에 대한 response를 정의)
- 5가지 grant type중 2가지 방식에서만 사용 ( Implicit , Authorization code)
○ Implicit : client-> Authorization server 최초요청만으로 토큰 발행 : response_type 은 token
○ Authorization code는 최초 요청에 code 리턴  

 

4. Grant_type

밑에서 자세히 설명하겠다 이건 

 

5. Scope (optional)


- Client가 접근 가능하도록 승인된 내 리소스의 범위
- Client가 authorization server에 토큰을 발급받은 이후, Resource Server를 지나서 실제
Resource에 접근하려고 할때, client별로 접근이 가능한 리소스를 구별해놓은 정보
( 예를들어 G마켓에서 네이버로 접근할때, 전화번호만가능, 생일까지 가능 이런?)

 

6. State (optional)

- Sate는 csrf 공격을 막기위한 정보 ???

 

 



Grant Type 5가지


1. Authorization code

 

- 가장 복잡한 방식이지만 가장 범용적으로 사용

- 인가 받은 code값을 토대로 토큰을 요청하는 방식
- Authorization Server에게 토큰을 발행 받기 위해 code값을 요청하고 이 code값을 
바탕으로 토큰을 발급 받는 방식
- Resonse_type = code


2. Implicit

- Client가 토큰발행을 요청하면 최초의 요청만으로 Authorization Server가 토큰 발행
- Response_type = token
- 쿼리스트링에 토큰 노출-> 모바일앱 또는 단말기에서 동작하는 웹 애플리케이션에서 주로 사용

 

3. Client Credentials

 

- 너무너무 신뢰가는 Client라서 Authorization Server가 묻지도 따지지도 않고 토큰 발행
- Resource Owner가 아닌 Client가 요청함

 

4. Resource Owner Password Credentials


- Resource Owner가 Client에게 id/password 전달함
- 토큰발행 요청하는 방식이 GET
- Resource Owner와 Client의 일급비밀(password/secret)을 모아서 토큰발행 요청 

 

5. Refresh 

 

- 최초에 token 받았을 때, 발급되는 refresh token으로 token 만료시, 재 발행 요청

- Authorization Code / Client Credentials Grant type 만 가능

안녕하세요~

 

2019년 10월말에

포르투갈 여행에 다녀왔는데요

 

그중에 리스본 

맛집 후기를 

쪄보도록 하겠습니다,,,

 

 

 

1. O Chiado

 

주소 : R. do Crucifixo 104, 1100-044 Lisboa, 포르투갈

구글 평점 : 4.5

 

이 집은

거의 생고기?를 뜨거운 돌판위에 

올려주는 스테이크가 아주 

신기방기해요

 

그래서 본인이 원하는 굽기만큼 

구워서 먹으면됩니닷,,

 

그리고 고기도 무척이나 두꺼워요!!!

 

그리고 

바깔라우 라고 

포르투갈에서 유명한 

대구 요리가 있는데

 

대구와 감자가 주 재료인 

요리인데

 

제가 포르투갈에서 먹은

바깔라우 요리중에서

여기가 제일 맛있었어요!!

 

 

그리고 저는 와인이랑 문어요리도 시켜서 먹었습니닷

모두 만족만족

 

저랑 동행들은 전화해서

예약해놓고 갔는데

자리가 그리 많지 않으니

 

예약하는걸 추천 드려요!

(전화해서,, 간단한 영어만하면

예약가능하니,, 어렵지 않습니당 ㅋ_ㅋ!!!)

 

 

 

2. Lisboa Há Mesa

 

주소 : R. das Portas de Santo Antão 95, 1150-265 Lisboa, 포르투갈

구글 평점 : 4.5

 

 

아주 가벼운 ,, 

그냥 기억도 잘안나는 무난한

조개 요리,,

이건 포르투갈 스테이크였는데

나름 나쁘지 않은 무난무난한

스테이크 였습니닷

 

 

 

가장 강추인것은....

이집의 해물밥 ㅠㅠㅠㅠㅠㅠ

 

여기 해물밥이 포르투갈에서 

해물밥 엄청 많이 먹었는데

진짜 쏘울 푸드입니닷....

 

 

거의 우리나라 국밥수준...

깊은 ㅠㅠ

해물 국물맛이란 ㅠㅠㅠㅠ

 

 

많은 해물 + 그리고 밥,,,,

 

진짜 우리나라 국밥이 생각나는 넘나 맛나는 음식이예요

 

게다가 양도 많습니다....

꼭 시켜주세요

이 집 해물밥 맛집입니다!!!!

 

둘이서 하나는 이거 무조건 먹어야해요,,,꼭,,,,

 

이 스타터가 아주 괜찮았어요 ~~

문어 샐러드 느낌!!!

 

그리고 가게 내부는 이렇게

한국인이 거의 없었고

동양인도 저희 밖에 없었어요

 

현지인이 많은 느낌이었습니다~

 

 

 

 

 

리스본에서도 많은 집을 갔지만

가장 맛있었던 집

기억 나는 집 두집만

 

기록하였어요~~

강추강추~

 

그럼 이만

+ Recent posts