반응형

 

 

 

 

튜플의 선언

tuple1 = (1, 2, 3, 4)

tuple2 = 1, 2, 3, 4

mylist = [1,2,3,4]
tuple3 = tuple(mylist)

 

** 튜플은 한번 정해진 순서를 바꿀 수 없다.

** 튜플은 값의 변경과 삭제가 불가능

 

 

튜플도 리스트처럼 인덱스를 쓸 수 있다.

tuple1 = (11, 22, 33)

for i in range( len( tuple1) ):
    print( tuple1[i] )

 

 

packing, unpacking

packing

  • 하나의 변수에 여러개의 값을 넣는 것

unpacking

  • 패킹된 변수에서 여러개의 값을 꺼내오는 것
c = (3, 4)
d, e = c    # c의 값을 언패킹하여 d, e에 값을 넣었다
f = d, e    # 변수 d와 e를 f에 패킹

 

튜플의 활용

  • 두 변수의 값을 바꿀 때 임시변수가 필요 없다.
  • 함수의 리턴 값으로 여러 값을 전달할 수 있다.

 

 

Packing 실습

x = 3
y = 5

position = (x,y)

print("x, y로 이루어진 튜플 position의 값은 {}입니다.".format(position))

 

 

 

Packing, Unpacking을 이용해 튜플의 값을 바꾸기

a = 1
b = 2

#코드를 작성해 보세요.
a, b = b,a

print("a : {}, b : {}".format(a, b))

 

 

 

 

튜플을 이용한 함수의 리턴값

튜플 리스트 활용

for a in enumerate(list):
    print('{}번째 값: {}'.format(a[0], a[1]))

for a in enumerate(list):
    print('{}번째 값: {}'.format(*a))

 

튜플 딕셔너리 활용

for a in dict.items():
    print('{}의 나이는:{}'.format(a[0], a[1]))

for a in dict.items():
    print('{}의 나이는:{}'.format(*a))

 

 

예시 )

products = {"풀" : 1800, "색종이" : 1000}

for product in products.items():
    print("{}은 {}원이다.".format(product[0], product[1]))

list = ['개', '고양이', '사자']
for product in enumerate(list):
    print("{}번째 값은 {}이다.".format(product[0], product[1]))

출력

풀은 1800원이다.
색종이은 1000원이다.
0번째 값은 개이다.
1번째 값은 고양이이다.
2번째 값은 사자이다.

 

 

 

 

 

 

input 조건을 넣어준 while문

while selected not in ['가위', '바위', '보']:
    selected = input('가위, 바위, 보 중에 선택하세요>')

 

 

while문으로 for문처럼 출력해보기

numbers = [1,2,3]
length = len(numbers)
i = 0
while 
i<length
:
    print(numbers[i])
    i = i + 1

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

딕셔너리

days_in_month = {
    #여기에 코드를 완성해 보세요.
    '1월' : 31,
    '2월' : 28,
    '3월' : 31
 }

print(days_in_month['2월'])

-> 28

 

 

딕셔너리의 이름표에는 문자열과 숫자형, 튜플을 사용할 수 있으며, 값으로는 어떤 자료형이 오던 상관 없습니다.

#            ↓ 이름표는 문자열 또는 숫자를 주로 사용하지만
dict = {     "이름표"    :    [1,2,3] }
#                           ↑ 값은 리스트를 포함해서 무엇이든 올 수 있습니다.

print( dict["이름표"] )

결과

[1, 2, 3]

 

 

 

 

딕셔너리 수정하기

  • 추가

    dict['three'] = 3

  • 수정

    dict['one'] = 11

  • 삭제

    del(dict['one'])

    dict.pop('two')

 

 

딕셔너리 Key와 Value 값 출력하기

days_in_month = {"1월":31, "2월":28, "3월":31, "4월":30, "5월":31}

for key in days_in_month.keys():
    print(key)
    
for value in days_in_month.values():
    print(value)

출력

1월
2월
3월
4월
5월
31
28
31
30
31

 

days_in_month = {"1월":31, "2월":28, "3월":31, "4월":30, "5월":31}

for key, value in days_in_month.items():
    #출력 형식은 아래 print함수를 참고하세요
    print("{}은 {}일이 있습니다.".format( key, value ) )

출력

1월은 31일이 있습니다.
2월은 28일이 있습니다.
3월은 31일이 있습니다.
4월은 30일이 있습니다.
5월은 31일이 있습니다.

 

 

 

인덱스를 이용하는 방법

products = {"풀" : 1800, "색종이" : 1000}

for product in products.items():
    print("{}은 {}원이다.".format(product[0], product[1]))

 

 

 

리스트와 딕셔너리 비교

 

 

 

값 확인

def check_and_clear(box):
    if "불량품" in box.keys():
        box.clear()
    
box1 = {"불량품" : 10}
check_and_clear(box1)
# {}가 출력되어야합니다.
print(box1)

box2 = {"정상품": 10}
check_and_clear(box2)
# {"정상품": 10}가 출력되어야합니다.
print(box2)

 

딕셔너리 합치기

products = {"풀":800, "딱풀":1200, "색종이":1000,"색연필":5000,"스케치북":3500}
catalog = {"겨울용 실내화":12000, "색종이":8000, "딱풀":1400}

products.update(catalog)

print(products)
{'풀': 800, '딱풀': 1400, '색종이': 8000, '색연필': 5000, '스케치북': 3500, '겨울용 실내화': 12000}

 

 

 

 

 

 

반응형
반응형

 

 

 

 

리스트

list = [1,2,3,4,5]

list[0] // 첫번째값
list[-1] // 마지막값
list[5], list[-6] // 에러
list[2] = 7 // 값 변경
rainbow=['빨강','주황','노랑','초록','파랑','남색','보라']
#rainbow를 이용해서 first_color에 값을 저장하세요
first_color = rainbow[0]
print('무지개의 첫번째 색은 {}이다'.format(first_color) )
rainbow=['빨강','주황','노랑','초록','파랑','남색','보라']
#rainbow를 이용해서 last_color에 값을 저장하세요
last_color = rainbow[-1]
print('무지개의 마지막 색은 {}이다'.format(last_color) )

 

 

 

리스트에 새로운 값을 추가하는 방법

  • list1=[1,2,3]이라고 할 때
  • append를 이용
    • list1.append(4)
    • append를 이용하면 리스트에 새로운 값이 추가된다.
  • 뒤에 새로운 리스트를 더하기
    • list2=list1+[4]
    • list1은 그대로 두고, 새로운 리스트를 만들어 낸다.
list1 = [1,2,3]
list2 = list1 + [4]

n = 4
if n in list2:
    print('{}가 리스트에 있다'.format(n))
list1=[1,2,3]
list2=[4,5,6]
list3 =list1+list2

print(list3)

=>  [1,2,3,4,5,6]

 

리스트에서 필요 없는 값을 지우는 방법

  • del을 이용해서 특정 위치의 값을 지우기
    • del list1[10] 리스트의 10번째 값을 지워라
  • remove를 이용해서 특정 값을 지우기
    • list1.remove(40)을 하면 리스트에 40이라는 값이 있는경우 삭제
    • 여러개의 값이 있는 경우 가장 앞에 있는 하나만 지워짐
list1=[1,2,3]
# 여기에 코드를 추가해 보세요.

del(list1[1])

print(list1)

 

 

 

For문

 

리스트를 for문으로 출력하기

list = ['가위','바위','보']

for n in list:
    print(n)

출력

가위
바위
보

 

 

for in range

range 함수

  • 필요한 만큼의 숫자를 만들어내는 유용한 기능
for i in range(5):
    print(i)
for i in range(0,5):
    print(i)

둘 다 결과는

0
1
2
3
4

 

enumerate

  • 리스트가 있는 경우 순서와 리스트의 값을 전달하는 기능
names = ['철수', '영희', '영수']
for i, name in enumerate(names):
    print('{}번: {}'.format(i + 1, name))

출력

1번: 철수
2번: 영희
3번: 영수

 

 

예시 )

rainbow=["빨","주","노","초","파","남","보"]
for i in range(len(rainbow)):
    color = rainbow[i]
    print('{}번째 색은 {}'.format(i+1,color))

출력

1번째 색은 빨
2번째 색은 주
3번째 색은 노
4번째 색은 초
5번째 색은 파
6번째 색은 남
7번째 색은 보

 

 

인덱스를 사용하여 출력하는 방법

list = ['개', '고양이', '사자']
for product in enumerate(list):
    print("{}번째 값은 {}이다.".format(product[0], product[1]))

 

 

 

 

 

모듈 사용하기

import math       # 수학과 관련된 기능
import random   # 무작위와 관련된 기능

math.pi
random.choice()

 

  • import math

    • 수학과 관련된 기능
  • import random

    • 무작위와 관련된 기능
  • import urllib.request

    • 인터넷의 내용을 가져오는 기능

 

 

모듈 만들기

  1. 사용할 함수, 메소드 코드를 작성한 모듈 파일을 생성
  2. 모듈이 쓰일 파일에 import를 사용하여 모듈을 호출
  3. 사용 방법은 기존의 모듈과 동일
  4. 주의할 점은 사용자가 만든 모듈과 모듈을 쓸 파일이 같은 폴더에 있어야 한다.

 

 

 

파이썬 공식문서 활용해보기

https://docs.python.org/3.5/library/random.html#random.choice 

 

9.6. random — Generate pseudo-random numbers — Python 3.5.9 documentation

9.6. random — Generate pseudo-random numbers Source code: Lib/random.py This module implements pseudo-random number generators for various distributions. For integers, there is uniform selection from a range. For sequences, there is uniform selection of

docs.python.org

import random

list = ["빨","주","노","초","파","남","보"]
random_element = random.choice(list)

print(random_element)

 

docs.python.org/3/library/random.html?highlight=random.randint#random.randint

 

random — Generate pseudo-random numbers — Python 3.9.1 documentation

random — Generate pseudo-random numbers Source code: Lib/random.py This module implements pseudo-random number generators for various distributions. For integers, there is uniform selection from a range. For sequences, there is uniform selection of a ran

docs.python.org

import random
random_number = random.randint(2,5)

print(random_number)

 

https://docs.python.org/3.5/library/random.html#random.shuffle 

 

9.6. random — Generate pseudo-random numbers — Python 3.5.9 documentation

9.6. random — Generate pseudo-random numbers Source code: Lib/random.py This module implements pseudo-random number generators for various distributions. For integers, there is uniform selection from a range. For sequences, there is uniform selection of

docs.python.org

import random
list = ["빨","주","노","초","파","남","보"]
# 여기에 코드를 작성해 보세요.

random.shuffle(list)

print(list)

 

 

 

 

 

 

 

반응형
반응형

 

변수선언과 print()

1. 코드

season = '겨울'
print('지금은', season, '입니다.')

 

2. 결과

지금은 겨울 입니다.

 

 

주석표시

#주석입니다아아아아
"""
여러 줄 주석은 이렇게 처리합니다아아아
"""

 

 

자동완성(Shell)

앞 1~2글자 입력 + tab 키 누르면 자동완성 기능

 

 

IF문

if True:
    print("조건식이 True이므로 실행됩니다.")
if False:
    print("조건식이 False이므로 실행되지 않습니다.")

** 주의 : if문 아래줄은 들여쓰기 되어야 한다.

from datetime import datetime 
hour = datetime.now().hour

#현재 시간이 12시보다 작을때만 print문을 실행하도록 이 아래줄에 if문을 추가하세요.

if(hour < 12):
    print('오전입니다.')#if문을 추가한 이후 이 줄은 들여쓰기 되어야 합니다.

 

 

IF ELSE문

mine = '가위'
yours = '바위'

if mine == yours:
    print("비겼습니다.")
#이 아래줄에 else문을 추가해서 비기지 않은 경우에만 아래 print문이 실행되도록 만들어 보세요
else:
    print("비기지 않았습니다.")#else문이 추가되고 나면 이 줄은 들여쓰기 되어야 합니다.

 

IF ELIF ELSE문

gender = "남자"

if gender == "남자":
    print("남자입니다.")
elif gender == "여자":
    print("여자입니다.")
else:
    print("논바이너리입니다")

 

 

 

 

현재 시간, 분 구하기

from datetime import datetime 
hour = datetime.now().hour
from datetime import datetime 
minute = datetime.now().minute

 

 

 

문자열.format()

number = 15
if number % 3 == 0: #number가 3의 배수인지 확인합니다.
    print("{}는 3의 배수입니다.".format(number))#이 코드는 실행됩니다.

number = 16
if number % 3 == 0: #number가 3의 배수인지 확인합니다.
    print("{}는 3의 배수입니다.".format(number))#이 코드는 실행되지 않습니다.
number = 20
welcome = '환영합니다'
base = '{} 번 손님 {}'

#아래 3개의 print는 같은 값을 출력
print(number,'번 손님',welcome)
print(base.format(number,welcome))
print('{} 번 손님 {}'.format(number,welcome))
#=>20 번 손님 환영합니다

 

 

 

함수 만들기

a = 5
b = 7

#이 아래줄에 a와 b를 더해서 result에 저장하는 함수add를 만들어 보세요.
def add():
    result = a + b #함수 내부의 코드가 되려면 이 줄은 들여쓰기 되어야 합니다.
    print(result) #함수 내부의 코드가 되려면 이 줄은 들여쓰기 되어야 합니다.
    
#이 아래에서 add함수를 사용해 보세요.
add()
def add(a,b):
    #함수 add에서 a와 b를 입력받아서 두 값을 더한 값을 result에 저장하고 출력하도록 만들어 보세요.
    result = a + b
    print( "{} + {} = {}".format(a,b,result) )#print문은 수정하지 마세요.

add(10,5)

 

 

 

Return이 있는 함수 만들기

def add_10(value):
	result = value + 10
	return result

n = add_10(5)
print(n)

 

 

 

따옴표/큰따옴표를 포함하는 문자열 만들기

#string1을 선언하세요.
string1 = """다스베이더가 말했다.
"내가 니 애비다!"
그 말을 들은 루크는 '깜짝' 놀랐다."""

print(string1)

""" 안에다 '작성'하면 된다. """

 

 

정수와 실수

정수

  • 영어로 integer, 줄여서 파이썬에서는 int라고 표현
  • 정수끼리 더하거나 곱하거나 빼면 정수
  • 정수끼리 나누면 실수가 나올 수 있으나, 나눗샘의 몫만을 구하려면 //연산자를 이용

    • a = 5//3 #계산결과 a=1

  • 실수를 정수로 바꾸려면 int를 이용

    • a=int(5.4)라고 하면 a는 5를 값으로 가지게 된다.

실수

  • 부동소수점이라는 표현법을 이용해 소숫점을 표시할 수 있는 숫자
  • 어느정도의 계산 정확도는 가지지만, 계산에 있어서 완벽한 정확성은 가지지 않는다.

    • 0.1+0.1+0.1 == 0.3 #FALSE

  • 정수를 실수로 바꾸려면 float를 사용

    • a=float(5)라고 하면 a는 5.0을 값으로 가지게 된다.
  • float끼리 비교하고 싶다면, 값을 float() 안에 넣어서 비교하면 된다.
height = float(169)
h2 = float(169)

if height == h2:
    print('같습니다')

-> 결과 : 같습니다.

 

 

사용자 입력 받기

print('가위 바위 보 중 하나를 내주세요> ')
mine = input()
print('mine:', mine)
mine = input('가위 바위 보 중 하나를 내주세요> ')
print('mine:', mine)

 

 

 

반응형
반응형

 

 

 

 

DTO란?

  • DTO란 Data Transfer Object의 약자입니다.
  • 계층간 데이터 교환을 위한 자바빈즈입니다.
  • 여기서의 계층이란 컨트롤러 뷰, 비지니스 계층, 퍼시스턴스 계층을 의미합니다.
  • 일반적으로 DTO는 로직을 가지고 있지 않고, 순수한 데이터 객체입니다.
  • 필드와 getter, setter를 가진다. 추가적으로 toString(), equals(), hashCode()등의 Object 메소드를 오버라이딩 할 수 있습니다.

 

DTO의 예

public class ActorDTO {
    private Long id;
    private String firstName;
    private String lastName;
    public String getFirstName() {
        return this.firstName;
    }
    public String getLastName() {
        return this.lastName;
    }
    public Long getId() {
        return this.id;
    }
    // ......
}

 

DAO란?

  • DAO란 Data Access Object의 약자로 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 객체입니다.
  • 보통 데이터베이스를 조작하는 기능을 전담하는 목적으로 만들어집니다.

 

ConnectionPool 이란?

  • DB연결은 비용이 많이 듭니다.
  • 커넥션 풀은 미리 커넥션을 여러 개 맺어 둡니다.
  • 커넥션이 필요하면 커넥션 풀에게 빌려서 사용한 후 반납합니다.
  • 커넥션을 반납하지 않으면 어떻게 될까요?

ConnectionPool

DataSource란?

  • DataSource는 커넥션 풀을 관리하는 목적으로 사용되는 객체입니다.
  • DataSource를 이용해 커넥션을 얻어오고 반납하는 등의 작업을 수행합니다.

 

반응형
반응형

 

 

 

 

 

Spring JDBC

  • JDBC 프로그래밍을 보면 반복되는 개발 요소가 있습니다.
  • 이러한 반복적인 요소는 개발자를 지루하게 만듭니다.
  • 개발하기 지루한 JDBC의 모든 저수준 세부사항을 스프링 프레임워크가 처리해줍니다.
  • 개발자는 필요한 부분만 개발하면 됩니다.

 

Spring JDBC - 개발자가 해야 할 일은?

spring JDBC

 

 

Spring JDBC 패키지

org.springframework.jdbc.core

  • JdbcTemplate 및 관련 Helper 객체 제공

org.springframework.jdbc.datasource

  • DataSource를 쉽게 접근하기 위한 유틸 클래스, 트랜젝션매니져 및 다양한 DataSource 구현을 제공

org.springframework.jdbc.object

  • RDBMS 조회, 갱신, 저장등을 안전하고 재사용 가능한 객제 제공

org.springframework.jdbc.support

  • jdbc.core 및 jdbc.object를 사용하는 JDBC 프레임워크를 지원

 

JDBC Template

  • org.springframework.jdbc.core에서 가장 중요한 클래스입니다.
  • 리소스 생성, 해지를 처리해서 연결을 닫는 것을 잊어 발생하는 문제 등을 피할 수 있도록 합니다.
  • 스테이먼트(Statement)의 생성과 실행을 처리합니다.
  • SQL 조회, 업데이트, 저장 프로시저 호출, ResultSet 반복호출 등을 실행합니다.
  • JDBC 예외가 발생할 경우 org.springframework.dao패키지에 정의되어 있는 일반적인 예외로 변환시킵니다.

 

 


실습코드

JdbcTemplate select 예제1

열의 수 구하기

int rowCount = this.jdbcTemplate.queryForInt("select count(*) from t_actor");

 

JdbcTemplate select 예제2

변수 바인딩 사용하기

int countOfActorsNamedJoe = this.jdbcTemplate.queryForInt("select count(*) from t_actor where first_name = ?", "Joe");

 

JdbcTemplate select 예제3

String값으로 결과 받기

String lastName = this.jdbcTemplate.queryForObject("select last_name from t_actor where id = ?", new Object[]{1212L}, String.class);

 

JdbcTemplate select 예제4

한 건 조회하기

Actor actor = this.jdbcTemplate.queryForObject(

  "select first_name, last_name from t_actor where id = ?",

  new Object[]{1212L},

  new RowMapper<Actor>() {

    public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {

      Actor actor = new Actor();

      actor.setFirstName(rs.getString("first_name"));

      actor.setLastName(rs.getString("last_name"));

      return actor;

    }

  });

 

JdbcTemplate select 예제5

여러 건 조회하기

List<Actor> actors = this.jdbcTemplate.query(

  "select first_name, last_name from t_actor",

  new RowMapper<Actor>() {

    public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {

      Actor actor = new Actor();

      actor.setFirstName(rs.getString("first_name"));

      actor.setLastName(rs.getString("last_name"));

      return actor;

    }

  });

 

 

JdbcTemplate select 예제6

중복 코드 제거 (1건 구하기와 여러 건 구하기가 같은 코드에 있을 경우)

public List<Actor> findAllActors() {

  return this.jdbcTemplate.query( "select first_name, last_name from t_actor", new ActorMapper());

}

private static final class ActorMapper implements RowMapper<Actor> {

  public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {

    Actor actor = new Actor();

    actor.setFirstName(rs.getString("first_name"));

    actor.setLastName(rs.getString("last_name"));

    return actor;

  }

}

 

 

JdbcTemplate insert 예제

INSERT 하기

this.jdbcTemplate.update("insert into t_actor (first_name, last_name) values (?, ?)",  "Leonor", "Watling");

 

JdbcTemplate update 예제

UPDATE 하기

this.jdbcTemplate.update("update t_actor set = ? where id = ?", "Banjo", 5276L);

 

JdbcTemplate delete 예제

DELETE 하기

this.jdbcTemplate.update("delete from actor where id = ?", Long.valueOf(actorId));

 

 

JdbcTemplate외의 접근방법

NamedParameterJdbcTemplate

SimpleJdbcTemplate

  • JdbcTemplate과 NamedParameterJdbcTemplate 합쳐 놓은 템플릿 클래스
  • 이제 JdbcTemplate과 NamedParameterJdbcTemplate에 모든 기능을 제공하기 때문에 삭제 예정될 예정(deprecated)
  • SimpleJdbcTemplate 예제

SimpleJdbcInsert

 

 


생각해보기

  1. JDBC 프로그래밍이 불편해서 이를 해결하기 위해서 등장한 기술에는 Spring JDBC 외에도 다양한 기술들이 존재합니다. 대표적으로 JPA와 MyBatis가 그러한 기술입니다. 문제를 해결하는 방법이 왜 여러 가지가 존재할끼요?
  2.  

http://blog.naver.com/PostView.nhn?blogId=admass&logNo=220870636605

 

한 DB에 Spring JPA와 Mybatis를 동시에 활용하기

Spring JPA와 Mybatis는 각각 장단점이 있습니다. Spring JPA의 경우에는 객체 단위로 CUD가 ...

blog.naver.com

Spring JPA와 Mybatis는 각각 장단점이 있습니다.

Spring JPA의 경우에는 객체 단위로 CRUD가 가능합니다. 일반적으로 CUD는 단일 테이블에 대하여 작업을 하는 경우가 많은데 Mybatis에서 하게 되면 해당 쿼리를 직접 짜고, 들어오는 Parameter에 대하여 모두 확인하여 처리해야 하는 경우가 많습니다.

그러나 MyBatis의 장점을 무시할 순 없습니다. ER-DB를 사용하는 경우 자기가 원하는 Query를 짜서 직접 데이터를 손쉽게 전달하고 처리할 수 있다는 장점이 있죠. 특히, Spring JPA에서 활용하는 상당히 복잡한 나름대로의 SQL을 배워야 하고, 테이블 Join을 하게 될 경우 해당 조건을 객체구조에도 녹여내야 하는 등 배우고 익혀서 적용해야 할 포인트가 많아지게 됩니다.

 

 

 

 

반응형

+ Recent posts