728x90

@RequestBody

 

- 클라이언트가 보내는 HTTP 요청 본문(Body) 을 Java 오브젝트로 변환한다.

- 요청 본문은 HttpMessageConverter를 통해 타입에 맞는 객체로 변환된다.

- Jons 형태의 HTTP Body 를  Java 객체로 변환한다.

- 기본 생성자로 객체를 만들고, Getter나 Setter 등의 메소드로 필드를 찾아 Reflection으로 값을 설정

 

 

@ModelAttribute

 

- 클라리언트가 보내는 HTTP 파라미터들을 특정 Java Object에 바인딩 함.

- Query String 형태 혹은 Form 형태의 데이터를 처리한다.

- 다양한 Validation 기능을 이용할 수 있다.

- 기본적으로 생성자로 값이 설정되고, 생성자로 설정되지 않은 필드는 Setter로 설정

 

728x90

'🟢 개념 정리 > Spring' 카테고리의 다른 글

Rest API  (0) 2023.07.20
CommandLineRunner vs ApplicationRunner  (0) 2023.05.23
서블릿이란?  (0) 2023.05.16
JSP vs Thymeleaf  (0) 2023.05.16
스프링 시큐리티  (0) 2023.03.20
728x90

동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술

서블릿은 서버에서 실행되다가 웹 브라우저에서 요청을 하면 해당 기능을 수행한 후 웹 브라우저에 결과를 전송

 

 

 

서블릿 동작 과정

 

728x90

'🟢 개념 정리 > Spring' 카테고리의 다른 글

CommandLineRunner vs ApplicationRunner  (0) 2023.05.23
@RequestBody vs @ModelAttribute  (0) 2023.05.17
JSP vs Thymeleaf  (0) 2023.05.16
스프링 시큐리티  (0) 2023.03.20
영속성 컨텍스트  (0) 2023.02.01
728x90

JSP

 

- 서블릿이라는 형태로 변환되어 실행이 된다.

- JSP 내에서 자바 코드를 이용할 수 있다.

- war로만 가능하다.

- 오직 서버를 통해서만 렌더링되고 html 응답결과를 받아야한 화면을 확인할 수 있다.

- 웹 어플리케이션 서버에서 동작하며 필요한 기능을 수행하고, 데이터를 웹페이지와 함께 클라이언트로 응답한다.

 

 

Thyemleaf

 

- 독립적 환경에서 사용 가능한 java 탬플릿 엔진이다.

- was 없이도 브라우저에서 띄울 수 있다.

- 전용 문법이 아닌 html 속성으로 값을 넣어준다.

- JSP 에 비해 속도가 느리다. ( 큰 차이는 없음 )

 

 

 

728x90

'🟢 개념 정리 > Spring' 카테고리의 다른 글

@RequestBody vs @ModelAttribute  (0) 2023.05.17
서블릿이란?  (0) 2023.05.16
스프링 시큐리티  (0) 2023.03.20
영속성 컨텍스트  (0) 2023.02.01
JPQL 이란  (0) 2023.02.01
728x90

리액트 핵심 기능 : 데이터가 변경될 때 마다 기존의 View 를 수정하는 것이 아니라 아예 새로 View 를 그린다.              

                              성능 문제를 위해 가상돔을 두고 이전과 현재의 가상돔을 비교해서 바뀐 부분의 View를 새로 넣어준다.

 

 

JSX : JavaScript 확장 문법. 

         중괄호 안에서 자바스크립트의 모든 문법을 사용할 수 있다.

         HTML 과 닮아있다.

 

 

< 리액트 요쇼 >

 

element 

 

- 리액트 앱의 가장 작은 단위

- 일반 객체

- ReactDom.render() 를 통해 요소를 렌더링 할 수 있고, React DOM 을 통해 변경 부분만 업데이트 한다.

 

 

컴포넌트

 

- UI를 독립적이고 재사용 가능한 조각들로 나누어준다.

 

 

속성 

 

- props 라고 하며 이는 properties 의 줄임말이다.

- props 는 읽기 전용으로 그 값을 수정하면 안된다.

 

 

상태

 

- private 하다.

- 업데이트를 스스로 알아서 하도록 만들 수 있다.

- 캡슐화라고도 불린다. state를 갖고 있는 컴포넌트 본인만 state에 접근할 수 있다.

- 상태 수정 시 setState() 를 사용한다. 또한 인자로 전달하는 함수를 작성해야 한다.

 

728x90
728x90

객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크

 

< 정의 >

 

- JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화

- 일반 SQL 쿼리, 저장 프로 시저 및 고급 매핑을 지원

- 모든 JDBC 코드 및 매개 변수의 중복작업을 제거

-  프로그램 코드와 SQL을 분리할 수 있음

 

< 장점 >

 

- 복잡한 쿼리나 다이나믹한 쿼리에 강하다.

- 프로그램 코드와 SQL 쿼리의 분리로 간결성, 유지보수성 향상

- 빠른 개발이 가능해서 생산성이 향상된다.

 

< JPA 와의 차이점 >

 

마이배티스 : SQL Mapper

 

- SQL문을 직접 작성하고 쿼리 수행 결과를 어떤 객체에 매핑할지 바인딩 하는 방법- DBMS 에 종속적임- 복잡한 쿼리문을 작성할 수 있다. 

 

JPA : ORM (Object Relational Mapping)

 

- 반복적인 SQL 문 필요없음- DBMS 에 종속적이지 않음- JPQL 과 SQL Mapper 를 혼용할 수 있음

- CRUD 기본 제공

- 데이터 정보가 바뀔 때 객체만 바꾸면 된다.

 

 

 

728x90

'🟢 개념 정리 > Database' 카테고리의 다른 글

Redis란?  (0) 2023.03.22
Hibernate  (0) 2023.01.20
728x90

우선은 product 로 접근을 했고 당연히 메모리 초과가 나왔다. 다음은 리스트에 중첩해서 쌓는 방식으로 했는데 이 역시도 메모리 초과가 나왔다. 그래서 재귀함수를 이용한 리스트 체크를 반복하는 걸로 구현했는데 이는 시간 초과가 나왔다.

 

dp 를 이용해서 푸는 문제였고, 이를 알기는 했는데 어떻게 할지 몰라서 구현을 못했다. 아래와 같은 방식이라고 한다.

 

import sys
from itertools import product
import math
 
# product 실패
sys.setrecursionlimit(10 ** 7)
a = ['O','L','A']
 
num = int(input())
 
def check(k):
    if k.count('L')>=2:
        return False
 
    for i in range(0,len(k)-2):
        if k[i]=='A' and k[i+1]=='A' and k[i+2] == 'A':
            return False
 
    return True
 
 
answer = 0
 
def re(k):
    if len(k)== num:
 
        global answer
 
        answer+=1
    else:
 
        if check(k+['L']) == True:
            re(k+['L'])
        if check(k+['O']) == True:
            re(k+['O'])
        if check(k+['A']) == True:
            re(k+['A'])
 
 
 
 
re(['O'])
re(['L'])
re(['A'])
 
print(answer)
 
 
 
728x90
728x90

조합으로 구현했고 테스트 케이스는 통과했으나 메모리 초과가 나서 실패했다. 찾아보니 투 포인터를 사용한 이분 탐색으로 푸는 문제라고 한다. 잘 이해는 되지 않는다.

import sys
from itertools import combinations
import math
 
n,m = list(map(int,sys.stdin.readline().split(" ")))
 
k = list(map(int,sys.stdin.readline().split(" ")))
 
# 각 구간의 목표 : 최대와 최소 값의 차이가 가장 작아야 한다.
 
# 조합으로 컷 할 인덱스를 뽑기
'''
num = [ ]
 
for i in range(1,len(k)):
    num.append(i)
 
 
# 0~m , m_n+1, ,,, n~
com = list(combinations(num,m-1))
 
 
answer =  [] 
 
for i in range(0,len(com)):
 
    answers = [ ]
 
    queue = [0]+list(com[i])+[len(k)]
 
    for j in range(0,len(queue)-1):
 
        temp_arr = k[queue[j]:queue[j+1]]
 
        answers.append(max(temp_arr)-min(temp_arr))
 
    answer.append(max(answers))
 
print(min(answer))
 
'''                    
 
 
 
 
 
 
 
 
 
 

 

728x90
728x90

수학적 접근으로 빨리 풀었다.

import sys
from itertools import combinations
import math
 
 
a = int(input())
b = int(input())
 
 
# 구간은 18개 존재
 
# 2,3,5,7,11,13,17
 
# 1 - 둘 다 소수가 아닌 경우
 
# 0,1,4,6,8,9,10,12,14,15,16,18
 
 
def check(possible, number):
 
    # 18개 중에서 possible 확률로 number 만큼 뽑힐 경우
 
    # ex) 18Cnumber * (possible의 number 제곱) * (1-possile)의 (18-number)제곱
 
    return math.factorial(18)/( math.factorial(18-number))/ math.factorial(number) *   possible**number * (1-possible)**(18-number)
 
 
 
 
answer1 = 0
answer2 = 0
 
no_sosu = [0,1,4,6,8,9,10,12,14,15,16,18]
 
for i in range(0,len(no_sosu)):
    answer1 += check(a/100,no_sosu[i])
    answer2 += check(b/100,no_sosu[i])
 
 
print(1-answer1*answer2)
 
 
 
728x90

+ Recent posts