본문 바로가기

분류 전체보기

(385)
[Python] top-level 코드 ( import시점 & runtime 시점 ) 파이썬에서 top-level 코드는 해당 모듈의 import 시점에, 단 한 번만 실행된다.* top-level 코드 : 함수/클래스 밖의 모듈. ( if 분기문, for 반복문, print 등 포함 ) (config.py)from datetime import datetimeprint(f"===import 시점 실행===")NOW = datetime.now() # top-level 코드print(f"[config.py] NOW(import): {NOW}")print(f"===import 시점 실행===")def get_current_time(): # top-level 코드 global NOW return NOW(main.py)from config import get_current_tim..
[JAVA] 타입 소거 (Type Erasure) 자바의 타입 소거? 자바의 설계 철학과 하위 호환성 때문에 생긴 개념. 기존 자바코드(JDK 1.4 이하)는 아래처럼 타입 안정성이 보장되지 않았었는데List list = new ArrayList();list.add("hello");list.add(123); // 문제 없음자바5부터 아래처럼 제네릭이 도입되면서 컴파일 과정에서 데이터 타입을 검사하게 됨.List list = new ArrayList();list.add("hello");list.add(123); // 컴파일 에러 제네릭 기능을 기존 자바 코드와 호환되게 하면서도, JVM 구조를 변경하지 않고 도입하기 위한 기법이 타입 소거!!컴파일 시에 제네릭을 검사하지만, 컴파일 이후에는 타입 정보가 사라지게 된다. 이로 인해 아래의 문제점들이 발생..
웹훅(Webhook) 웹훅(Webhook)특정 이벤트가 발생하면 지정된 URL로 HTTP (POST)요청을 자동으로 보내는 방식. (ex) 결제완료알림, 푸시알림 등..) 웹훅 수신 서버에서는 요청에 대한 처리 로직 실행.웹훅 요청 서버 : 이벤트 발생 --> 웹훅 요청 (자동전송)웹훅 수신 서버 : 웹훅 요청 수신 --> 이벤트타입/기본정보 확인 (--> 추가정보 필요시 API 호출) --> 내부 처리 진행.웹훅요청은 단순히 특정 이벤트에 대한 알림용 신호이기 때문에 요청 데이터에는 간단한 요약정보만 포함.따라서 수신 서버에서는 알림을 받으면 API를 호출해서 추가 정보를 얻는 방식으로 진행. ** API는 클라이언트의 요청에 대해 응답을 받아 처리하지만,웹훅은 요청 없이도 이벤트 발생시 서버에서 자동으로 데이터를 전송한다..
[Java] ObjectMapper (2) TypeReference, 설정메서드, 어노테이션 * TypeReference Jackson의 ObjectMapper에서 제공하는 클래스로역직렬화(deserialization) 과정에서 제네릭 타입 정보를 전달하기 위해 사용.** 단일 객체가 아닌 복잡한 타입인 경우, 런타임에 타입 정보가 사라지기 때문에 명시적으로 타입을 전달해줘야함.      List, Map, List>     JSON 문자열 --> List String json = "[{\"name\":\"phyho\",\"age\":10}]";List users = mapper.readValue(json, new TypeReference>() {});  JSON 문자열 --> MapString json = "{\"name\":\"phyho\", \"age\":10}";Map map = mapp..
[Java] ObjectMapper (1) 주요 메서드 * ObjectMapper  Jackson 라이브러리에서 제공하는 클래스로 JSON 데이터와 Java 객체 간의 직렬화 및 역직렬화에 사용. ( Java 객체 ↔ JSON ) ex) User 클래스public class User { private String name; private int age; // 생성자와 getter/setter 필수 public User() {} public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } ..
[MyBatis / MySQL] useGeneratedKeys, keyProperty, keyColumn * useGeneratedKeys="true" DB에서 자동 생성된 기본 키(PK)값을 Java 객체로 가져올 수 있는 MyBatis 설정.( JDBC의 getGeneratedKeys() 호출을 MyBatis가 자동으로 처리해준다 )* keyPropertyJava 객체 필드명* keyColumnDB테이블 컬럼명  INSERT INTO test_table (item_id, item_name, item_des) VALUES (#{itemId}, #{itemName}, #{itemDes})=> 해당 컬럼에 대한 AUTO_INCREMENT 설정 필요 (MYSQL) => keyProperty 와 keyColumn 각각 이름 일치여부 주의  insert 이후에 생성된 키(id)를 받아 바로 update를..
[Java] "".equals(null) (equals 메서드) String.equals(Object obj) 메서드는 내부적으로 매개변수가 null일 경우 false를 반환한다.null.equals("")는 예외를 발생시키지만, "".equals(null)은 안전하게 false를 반환!! (equals메서드 내부로직)@Overridepublic boolean equals(Object anObject) { if (this == anObject) { // 같은 객체인지 확인 return true; } if (anObject instanceof String) { // anObject가 String 타입인지 확인 String anotherString = (String) anObject; int n = value.le..
[Python] 패킹(Packing) & 언패킹(Unpacking) * 패킹(Packing) 여러 개의 값을 하나의 튜플로 패킹.data = 1, 2, 3print(data)# 출력결과 : (1, 2, 3)=> 여러개의 값을 data 라는 변수에 패킹. 출력결과는 튜플인 것을 확인할 수 있다.  * 언패킹(Unpacking)하나의 변수에 묶여 있던 값을 여러 변수에 나눠서 할당. (자바스크립트의 구조분해할당과 유사한듯)a, b, c = dataprint(a) # 출력결과: 1print(b) # 출력결과: 2print(c) # 출력결과: 3=> data 튜플에 담겨있던 값들을 각각 a, b, c라는 변수에 언패킹.언패킹 변수의 갯수와 데이터(튜플, 리스트 등) 갯수를 맞춰줘야함!!  파이썬은 여러개의 값을 return하면 자동으로 튜플로 묶어버린다. (패킹)def g..