https://learn.microsoft.com/ko-kr/training/modules/wsl-introduction/install-and-setup

 

연습 - Training

WSL을 사용하여 Windows에 Linux 배포판을 설치하고, Linux 사용자 이름 및 암호를 설정하고, wsl install 명령을 사용하는 방법을 이해합니다.

learn.microsoft.com

 

cmd 창에서 wsl --install 입력 -> 시스템 재시작하라고 뜹니다.

저의 경우 terminal 에서 wsl --install 을 치니까 다운받은 파일이 있다고 깔더라구요.

 

해당 설정창에서 저의 경우 terminal을 열면 바로 Ubuntu로 열리도록 설정을 바꾸었습니다. 

 

위의 마이크로소프트 링크 따라서 하면 쉽게 WSL (Windows Subsystem for Linux) 환경을 세팅하실 수 있습니다.

목표: AWS Lambda 에서 S3에 있는 object를 가져와 확인해보기

(AWS Documentation)

https://docs.aws.amazon.com/ko_kr/code-library/latest/ug/python_3_lambda_code_examples.html#serverless_examples

 

SDK for Python (Boto3)을 사용한 Lambda 예제 - AWS SDK 코드 예제

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

S3 버킷에 객체를 업로드할 때 트리거된 이벤트를 수신하는 Lamdba 함수를 구현하는 방법에 대한 Python 샘플 코드가 작성되어 있다.

 

import json
import urllib.parse
import boto3

print('Loading function')

s3 = boto3.client('s3')

def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))

    # Get the object from the event and show its content type
    # bucket = event['Records'][0]['s3']['bucket']['name']
    # key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    bucket = 'inhyetest'
    key = 'test/image.png'
    try:
        response = s3.get_object(Bucket = bucket, Key = key)
        print("CONTENT TYPE: " + response['ContentType'])
        return response['ContentType']
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e

 

 

저는 S3에 업로드한 Object를 가져와 보는 것이 목표였기 때문에 위 url의 샘플 코드에서 필요없는 부분을 주석처리 하여 확인해보았습니다. 

 

그냥 저의 S3 버킷에서 위에 써놓은 파일을 읽어서 Content-type을 보여주는 간단한 프로그램이라서 아무 파라미터 없이 테스트 누르시면 됩니다.

 

테스트 결과

 

참고로 버킷은 따로 커스텀한 설정없이 기본 설정으로 만들었습니다. 

객체소유권 - ACL 비활성화됨(권장)

이 버킷의 퍼블릭 액세스 차단 설정 - 모든 퍼블릭 액세스 차단

버킷 버전 관리 - 비활성화

기본 암호화 - Amazon S3 관리형 키(SSE-S3)를 사용한 서버 측 암호화

버킷 키 - 활성화

 

'정보 > Web' 카테고리의 다른 글

[Mozilla] Web의 동작 방식  (0) 2022.01.13
HTTP와 HTTPS  (0) 2022.01.09

https://spring.io/guides/gs/rest-service/ 

 

Getting Started | Building a RESTful Web Service

In Spring’s approach to building RESTful web services, HTTP requests are handled by a controller. These components are identified by the @RestController annotation, and the GreetingController shown in the following listing (from src/main/java/com/example

spring.io

 

스프링 부트에서는 알아서 Jackson JSON 라이브러리를 사용해서 클래스를 JSON으로 바꿔준다. Jackson은 web starter에 기본적으로 포함되어 있다. 

 

RESTful 웹 서비스를 만드는데 스프링의 접근법에서, HTTP 요청은 컨트롤러에 의해 다뤄진다. @RestController 애노테이션을 사용한다. 

Run the Service

@GetMapping 애노테이션은 HTTP GET 요청이 설정한 문자열로 매핑되어 매핑된 문자열에 해당되는 메소드를 실행시킨다. 

@PostMapping 애노테이션 은 HTTP POST요청.

(@RequestMApping(method=GET), @RequestMApping(method=POST) 와 같은 의미)

	@GetMapping("/greeting")
	public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
		return new Greeting(counter.incrementAndGet(), String.format(template, name));
	}

@RequestParam 은 쿼리스트링 파라미터 name을 greeting() 메소드에 name 파라미터로 바인딩 시켜준다. 만약 name 파라미터가 부재한다면 defaultValue로 설정한 World 가 사용된다.

 

전통적인 MVC 컨트롤러와 RESTful 웹 서비스 컨트롤러의 핵심 차이는 HTTP response body가 생성되는 방식이다. 데이터를 HTML로 서버사이드 렌더링을 수행하는 view technology에 의지하는 대신, RESTful 웹 서비스는 데이터 객체자체를 리턴한다. 객체데이터가 HTTP response에 JSON의 형식으로 직접적으로 쓰여진다. 

 

@RestController 애노테이션은 해당 클래스의 모든 메소드는 view가 아닌 객체를 리턴하는 컨트롤러로 동작하도록 한다. @Controller와 @ResponseBody 두 애노테이션을 포함하는 약칭이다. 

 

객체를 JSON으로 바꿀 때는 사용자가 직접할 필요 없이 클래스패스에 Jackson2가 있어서 스프링의 MappingJackson2HttpMessageConverter가 자동으로 JSON으로 변환해준다. 

 

@SpringBootApplication 애노네이션은 다음을 포함한다.

- @Configuration : 해당 클래스를 application context를 위한 bean 정의의 source로서 태그를 지정한다.

- @EnableAutoConfiguration : 스프링 부트에게 클래스패스의 설정과 다른 bean, 그리고 다양한 property 설정을 추가하는 것을 시작하라고 한다. 예를 들어, spring-webmvc가 클래스패스에 있으면 애플리케이션을 웹 애플리케이션이라고 표시하고 DispatcherServlet과 같은 주요 동작을 설정한다.

- @ComponentScan : 다른 컴포넌트나, 설정, com/example 패키지에 있는 서비스를 찾게 한다. 

 

main() 메소드는 스프링 부트의 SpringApplication.run() 메소드를 사용해서 애플리케이션을 시작한다. 

 

★ web.xml 파일도 없고, 웹 앱을 100% 순수 자바로 설정할 수 있다. 

 

그래들이나 메이븐을 커맨드라인으로 애플리케이션을 실행시킬 수 있고, 또, 모든 디펜던시, 클래스, 리소스 등을 포함하는 단일 실행가능한 JAR파일을 빌드할 수도 있다.실행가능한 jar를 빌딩하는 것은 다른 환경에 따른 개발 라이프싸이클 동안 애플리케이션을 배포하는 것, 옮기는 것, 버전관리하는 것을 쉽게 한다. 

 

Gradle 을 사용하는 경우

1) ./gradlew bootRun으로 애플리케이션을 실행할 수 있다.

2) ./gradlew build 로 빌드하고 JAR파일을 java -jar build/libs/gs-rest-service-0.1.0.jar 로실행할 수 있다.

 

 

Maven 을 사용하는 경우

1) ./mvnw spring-boot:run 으로 애플리케이션을 실행할 수 있다. 

2) ./mvnw clean package 로 빌드하고 java -jar target/js-rest-service-0.1.0.jar 로 실행할 수 있다.

'정보 > Framework' 카테고리의 다른 글

[Java] Interface Filter 필터  (0) 2023.08.04

https://learn.microsoft.com/ko-kr/windows/security/threat-protection/security-policy-settings/log-on-as-a-service?source=recommendations

 

서비스로 로그온 - Windows Security

서비스로 로그온 보안 정책 설정에 대한 모범 사례, 위치, 값, 정책 관리 및 보안 고려 사항을 설명합니다.

learn.microsoft.com

 

서비스에 들어오면 다음 사용자로 로그인이 있다.

저기에 계정을 지정해서 추가하게 되면 해당 계정에게 권한을 부여해야한다.

제어판 > 사용자 계정에 추가했던 계정을 추가하면서 관리자 권한으로 추가한다. 

https://ko.javascript.info/object-copy

 

참조에 의한 객체 복사

 

ko.javascript.info

https://ko.javascript.info/array

 

배열

 

ko.javascript.info

 

알았던 것도 다시 보자!

 

상황

firstFunction() {
	let results = property(code) //[{name: "John", age: 23}] 가 있다고 가정
	...
    secondFunction(results);
}

secondFunction(records) {
	...
    thirdFunction(records);
}

thirdFunction(data) {
	...
    data.unshift({name: "Sandy", age: 25});
}

완전 같은 건 아니지만 이런 상황인 경우..

firstFunction안에서 secondFunction으로 넘겼던 results가 secondFunction을 거쳐 thirdFunction에서 파라미터로 받아져서 객체를 배열에 추가 시킨것... 즉 처음 가져왔었던 property(code)에서 가져온 원래 배열에도 추가가 된 것이다...

 

요약

객체는 참조에 의해 할당되고 복사됩니다. 변수엔 객쳊체가 아닌 메모리상의 주소인 참조가 저장됩니다. 따라서 객체가 할당된 변수를 복사하거나 함수의 인자로 넘길 땐 객체가 아닌 객체의 참조가 복사됩니다. 

그리고 복사된 참조를 이용한 모든 작업(프로퍼티 추가.삭제 등)은 동일한 객체를 대상으로 이뤄집니다. 

 

배열의 내부 동작 원리

배열은 특별한 종류의 객체입니다. 배열 arr의 요소를 arr[0]처럼 대괄호를 사용해 접근하는 방식은 객체 문법에서 왔습니다. 다만 배열은 키가 숫자라는 점만 다릅니다. 

숫자형 키를 사용함으로써 배열은 객체 기본 기능 이외에도 순서가 있는 컬렉션을 제어하게 해주는 특별한 메서드를 제공합니다. length라는 프로퍼티도 제공하죠. 그렇지만 어쨌든 배열의 본질은 객체입니다.

이렇게 배열은 자바스크립트의 일곱 가지 원시 자료형에 해당하지 않고, 원시 자료형이 아닌 객체형에 속하기 때문에 객체처럼 동작합니다.

배열은 객체와 마찬가지로 참조를 통해 복사됩니다. 

'정보 > Language' 카테고리의 다른 글

Kotlin: Functions  (0) 2023.08.02
Kotlin: Control Flow  (0) 2023.07.31
Kotlin : Hello, world!  (0) 2023.07.20
Enum을 사용한 메뉴관리  (0) 2022.08.26
java.util.HashMap  (0) 2022.07.29

https://javadoc.io/doc/javax.servlet/javax.servlet-api/latest/index.html

 

javax.servlet-api 4.0.1 javadoc (javax.servlet)

Latest version of javax.servlet:javax.servlet-api https://javadoc.io/doc/javax.servlet/javax.servlet-api Current version 4.0.1 https://javadoc.io/doc/javax.servlet/javax.servlet-api/4.0.1 package-list path (used for javadoc generation -link option) https:/

javadoc.io

javax.servlet에서 제공하는 filter에 대해 알아보자.

일단 filter는 Interface이므로 implement하고 메소드를 override하여 커스텀필터를 만들 수 있다.

import javax.servlet.*;      
import java.io.IOException;  

public class customFilter implements Filter {                                                                                                            
                                                                                                                                                         
    @Override                                                                                                                                            
    public void init(FilterConfig filterConfig) throws ServletException {                                                                                
                                                                                                                                                         
    }                                                                                                                                                    
                                                                                                                                                         
    @Override                                                                                                                                            
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    	//모든 request, response가 오므로, 뭔가 인증이나 권한체크를 한다!
    }                                                                                                                                                    
                                                                                                                                                         
    @Override                                                                                                                                            
    public void destroy() {                                                                                                                              
                                                                                                                                                         
    }                                                                                                                                                    
}

documentation ) 

필터는 the request to a resource 또는 the response from a resource 혹은 두 상황 모두에서 필터링을 제공한다.

doFilter 메소드에서 필터링을 한다. 모든 필터는 FilterConfig object에 접근할 수 있고,ServletContext에 참조 권한이 있다.

 

확인된 예들

  1. Authentication Filters
  2. Logging and Auditing Filters
  3. Image conversion Filters
  4. Data compression Filters
  5. Encryption Filters
  6. Tokenizing Filters
  7. Filters that trigger resource access events
  8. XSL/T filters
  9. Mime-type chain Filter

doFilter 메소드는,

void doFilter(ServletRequest request,
              ServletResponse response,
              FilterChain chain)
       throws IOException,
              ServletException

chain의 끝에 리소스에 client의 request로 request/response 쌍이 chain을 지날때마다 container에서 호출된다. 이 메소드로 통고된 FilterChain은 Filter가 chain의 다음 entity로 접근할 수 있을지 허락한다.

chain.doFilter() 을 통해 다음 entity를 깨우거나 request의 실행을 막아 접근이 불가능하게 한다.

 

init메소드나 destroy메소드는 기본적으로 뭔가 수행하지 않는다. custom하여 사용은 할 수 있겠지만

init메소드는 filter가인스턴스화 되었을때 한번 호출되고, destroy는 filter의 doFilter메소드에 모든 쓰레드가 종료되거나 제한시간이 경과한 후일 때만 호출된다.

 

 

'정보 > Framework' 카테고리의 다른 글

[SpringBoot] Rest-Service  (0) 2024.01.18
import kotlin.math.PI

//Functions 함수

//함수 선언할때는 fun keyword를 사용한다.
fun hello() {
    return println("Hello, world!")
}

//x, y는 함수의 파라미터이고 Int타입. return타입 또한 Int타입.
/*fun sum(x: Int, y: Int): Int {
    return x + y
}*/
//위의 함수를 Single-expression function으로 바꾸면
fun sum(x: Int, y: Int) = x + y
//이렇게 할 수 있음. 대괄호를 없애고 할당연산자 = 를 통해 함수몸체를 선언한다. 코틀린의 type inference덕분에 return type또한 제거할 수 있다.

//Named arguments, Default parameter values
//파라미터에 이름을 붙이면 코드의 가독성이 좋아짐
fun printMessageWithPrefix(message: String, prefix: String = "Info") {
    println("[$prefix] $message")
}

//Return이 없는 함수
fun printMessage(message: String) {
    println(message)
    // `return Unit` or `reutnr` is optional
    //함수에서 return value가 없으면 그 함수의 return type은 Unit이다. Unit은 오직 하나의 value를 갖는 type이다.
    //함수 몸체 안에 명시적으로 선언할 필요가 없다.
}

fun main() {
    hello()
    println(sum(1, 2))
    printMessageWithPrefix("Hello, world!", "Greeting")
    //named arguments를 통해 직접 할당하게 되면 파라미터의 순서를 바꿀 수 있다.
    printMessageWithPrefix(prefix = "Log", message = "Hello")
    //prefix는 default value를 주어서 파라미터를 안넘기면 기본값이 출력된다.
    printMessageWithPrefix("This is a custom message.")
    //[Info] This is a custom message.

    //return이 없는 함수
    printMessage("This function doesn't have return type.")
}


fun circleArea(radius: Int)  =  radius * radius * PI

https://kotlinlang.org/docs/kotlin-tour-functions.html#lambda-expressions

 

Functions | Kotlin

 

kotlinlang.org

 

'정보 > Language' 카테고리의 다른 글

[Javascript] Object, Array  (0) 2024.01.09
Kotlin: Control Flow  (0) 2023.07.31
Kotlin : Hello, world!  (0) 2023.07.20
Enum을 사용한 메뉴관리  (0) 2022.08.26
java.util.HashMap  (0) 2022.07.29

+ Recent posts