1. 현상

 - Spring boot 1.5.14 로 프로젝트를 세팅하는 중 에러 발생.

 - Lombok Annotation 적용해놓은 class에서 컴파일 에러

 - Github 이슈함 검색... 버그...


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sample {
private String test1;
private String test2;

}


2. 해결법

 - @NoArgsConstructor 를 @Data 보다 위에 선언해야한다.


@NoArgsConstructor
@AllArgsConstructor
@Data
public class Sample {

private String test1;
private String test2;

}


* 관련 문서

https://github.com/rzwitserloot/lombok/issues/1703



1. Filter

public interface Filter {
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain);
}

 1) Filter란?

  - J2EE 표준 스팩

 2) init()

  - 필터 인스턴스 초기화

 3) doFilter()

  - 전/후 처리

 4) destroy()

  - 필터 인스턴스 종료

 

2. Interceptor

 - 소스

public interface HandlerInterceptor {


@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;

@Override
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;

@Override
public void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;

}

 1) Interceptor란?

  - Spring Framework에서 지원하는 스팩


 2) preHandle()  

  - Controller 전에 호출된다.

  - return 값이 false일 경우 controller 및 다음 postHandle 역시 호출되지 않는다.

  - 인증처리 등을 추가하면 좋다.

  - 요청 로그를 남기기 좋다.


 3) postHandle()

  - Controller가 호출되고 난 뒤 호출된다.

  - Request 값을 변경하는데 사용하면 좋다.

  - View에 공통적으로 값을 추가할 때 사용하면 좋다.


 4) afterCompletion()

  - 뷰 렌더링까지 완료된 후에 호출된다.


3. Filter와 Interceptor 차이점

 1) Filter는 Dispatcher servlet 앞단에서 처리한다. Interceptor는 Controller 시작부터해서 메소드별로 라이프 사이클에 맞게 호출된다.

 2) Interceptor와 다르게 Filter는 web.xml에 설정을 추가한다.



1. thymeleaf-layout-dialect 추가(관련 글)

 1) 기존

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

 2) 변경

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>


1. S3 버킷 설정



2. 설정 추가

{

   "Version":"2012-10-17",

   "Id":"S3PolicyId1",

   "Statement":[

      {

         "Sid":"IPAllow",

         "Effect":"Allow",

         "Principal":"*",

         "Action":"s3:*",

         "Resource":"arn:aws:s3:::examplebucket/*",

         "Condition":{

            "NotIpAddress":{

               "aws:SourceIp":"0.0.0.0/32"

            },

            "IpAddress":{

               "aws:SourceIp":[

                  "54.240.143.0/24",

                  "54.241.143.0/24"

               ]

            }

         }

      }

   ]

}


3. 관련문서

 - https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-3

User Bios - The bio field on the User object is no longer available. If the bio field was set for a person, the value will now be appended to the about field.


1. 문제

 - spring-social-facebook:2.0.3 에서 'PROFILE_FIELDS' 내 bio 필드가 있어서 안됨. (위 내용 참고)

 - https://developers.facebook.com/docs/graph-api/changelog


 1) 해결법

  - 기존소스 

Connection<Facebook> connection = facebookConnectionFactory.createConnection(accessGrant);
Facebook facebook = connection.getApi();
User userProfile = facebook.userOperations().getUserProfile();

 - 변경 소스

Connection<Facebook> connection = facebookConnectionFactory.createConnection(accessGrant);
Facebook facebook = connection.getApi();
String [] fields = { "id", "email", "first_name", "last_name" };
User userProfile = facebook.fetchObject("me", User.class, fields);


2. 가능한 필드

{
"id",
"about",
"age_range",
"birthday",
"context",
"cover",
"currency",
"devices",
"education",
"email",
"favorite_athletes",
"favorite_teams",
"first_name",
"gender",
"hometown",
"inspirational_people",
"installed",
"install_type",
"is_verified",
"languages",
"last_name",
"link",
"locale",
"location",
"meeting_for",
"middle_name",
"name",
"name_format",
"political",
"quotes",
"payment_pricepoints",
"relationship_status",
"religion",
"security_settings",
"significant_other",
"sports",
"test_group",
"timezone",
"third_party_id",
"updated_time",
"verified",
"video_upload_limits",
"viewer_can_send_gift",
"website",
"work"
}


참고 링크

https://stackoverflow.com/questions/39890885/error-message-is-12-bio-field-is-deprecated-for-versions-v2-8-and-higher

1. 동적으로 HTML Form을 생성

<html> 
<head>
</head>
<body>
<script>
generatorForm();

function generatorForm() {
var formEle = document.createElement("form");
formEle.setAttribute('method',"post");
formEle.setAttribute('action',"/action");

var tmpInput = document.createElement("input"); //input element, text
tmpInput.setAttribute('type',"text");
tmpInput.setAttribute('name',"tempValue");

formEle.appendChild(tmpInput);

var submitBtn = document.createElement("input"); //input element, Submit button
submitBtn.setAttribute('type',"submit");
submitBtn.setAttribute('value',"Submit BTN");

formEle.appendChild(submitBtn);

document.body.appendChild(formEle);
}
</script>
</body>
</html>


2. 문제 발생

 1) 에러

document.body.appendChild(formEle);

  - 위 소스를 추가 안할 경우 제대로 동작을 안함. 꼭 추가해야함.


Pivotal 이 서울에서 처음 진행하는 행사라고 함.



1. 개발에 집중하기
- 개발자가 개발에 집중 할 수 있어야한다.
- 운영환경에서 손쉽게 모니터링을 할 수 있어야한다. (Spring actuator)
- 배포는 편하게 잘~ 되어야한다.



-> 위 내용을 듣는동안 공감이 많이 갔다. 업무를 진행하면서 세팅한 프로젝트들은 위 내용들을 잘 수행하였는가? 부족한 부분이 어디였을까?를 고민했다. 그러다보니 어느정도는 구축해서 운영하는 듯 했다. 모니터링에 필요한 apm을 운영했고, jenkins를 사용하여 보다 편하게 배포를 진행했던 것 같다. 단, 더 잘 할 수 있었을 것 같은 부분들이 있어서 그 부분들을 좀 더 고민해봐야겠다



2. Netflix
- netflix oss
- Zuul, Eureka.....

-> 자주 들었던 이야기지만, 역시나 대단한 회사다. 내부적으로 만든 프로그램을 오픈소스로 공개하고, 좋은 경험을 공개하는 이 회사가 참 대단하다고 한번 더 느꼈다.


3.PCF(Pivotal Cloud Foundry)
- UI가 잘 되어있다.
- 아~ 있으면 좋겠다~ 하는 기능이 많다! (Spring boot admin과 같이 필요한 기능이 잘 되어 있는 듯 하다.)

-> 나중에 시간을 내서 사용해봐야겠다. 사용해봐야 추후 만들 때 도움이 되니까!!



* 사진은 정말 대충 찍었습니다.

'개인 > 단상' 카테고리의 다른 글

2018-08-21  (0) 2018.08.22
2018-06-05 : Cloud Native Day in seoul  (0) 2018.06.05
2018-05-01  (0) 2018.05.01
Aws re:invent 2017! 후기  (0) 2017.12.02
2016-10-01  (0) 2016.10.01
2016-09-08  (0) 2016.09.08

1. Content Type

 - 파일명에 따라 ContentType을 설정한다.


ObjectMetadata objMeta = new ObjectMetadata();
objMeta.setContentType(Mimetypes.getInstance().getMimetype(saveFileNm));


2. Content Length

 - byte length를 추가한다.

ObjectMetadata objMeta = new ObjectMetadata();

byte[] bytes = IOUtils.toByteArray(targetIS);
objMeta.setContentLength(bytes.length);

ByteArrayInputStream byteArrayIs = new ByteArrayInputStream(bytes);

PutObjectRequest putObjReq = new PutObjectRequest(bucketName, key, byteArrayIs, objMeta);
s3client.putObject(putObjReq);

 - 해당 소스처리를 안할 경우 아래와 같은 warning 메시지가 뜬다.

[WARN ] c.a.services.s3.AmazonS3Client:1714 - No content length specified for stream data.  Stream contents will be buffered in memory and could result in out of memory errors.


3. 임시파일로 업로드

 - 서버 내 파일을 저장하지않고, 바로 S3에 업로드할 때 사용하면 좋다.

File file = File.createTempFile("test", ".txt");
file.deleteOnExit();


1. 약수

 -  어떤 수를 나누어 떨어지게 하는 수.


2. Python 소스

if __name__ == "__main__":
number = int(input("숫자를 입력해주세요. : "))

divisors = []

for i in range(1, number + 1):
if number % i == 0:
divisors.append(i)

print(divisors)


'프로그래밍 > Python' 카테고리의 다른 글

10진수 n진수로 변환하기.  (0) 2018.07.30
[Basic] 약수  (0) 2018.06.04

+ Recent posts