해당 내용은 chat GPT에 질문하여 생성된 내용 입니다. 참고만 하시길.. 

Q : Spring 프레임워크에서 제어의 반전 개념과 그것이 어떻게 구현되는지 설명
A : 제어 반전(IoC)은 소프트웨어에서 더 나은 모듈화와 유연성을 허용하는 설계 패턴이다. 구성 요소가 종속성을 선언하도록 허용하고 실행 시 IoC 컨테이너가 종속성을 주입하도록 함으로써 프로그램의 전통적인 제어 흐름을 뒤집는 것을 포함한다. Spring 프레임워크는 메타데이터를 사용하여 빈이라고 하는 애플리케이션 개체의 인스턴스를 구성하고 관리하는 IoC 컨테이너의 예입니다. IoC 컨테이너를 사용하여 종속성을 관리함으로써 개별 구성요소 자체를 변경할 필요 없이 애플리케이션을 보다 쉽게 확장하고 수정할 수 있습니다.

 

ioc 관련 java class 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class OrderService {
    
    private final InventoryService inventoryService;
    
    @Autowired
    public OrderService(InventoryService inventoryService) {
        this.inventoryService = inventoryService;
    }
    
    public void placeOrder(String productId, int quantity) throws OutOfStockException {
        if (inventoryService.checkAvailability(productId, quantity)) {
            inventoryService.reserve(productId, quantity);
            // ... continue with order processing
        } else {
            throw new OutOfStockException(productId);
        } 
    }
}

InventoryService 클래스에 대한 종속성이 있는 OrderService 클래스가 있습니다. InventoryService는 OrderService의 인스턴스를 생성할 때 InventoryService의 인스턴스를 제공하도록 Spring IoC 컨테이너에 알리는 @Autowired 주석을 사용하여 OrderService에 주입됩니다.

OrderService는 InventoryService를 사용하여 제품의 가용성을 확인하고 재고가 있는 경우 예약합니다. 

IoC를 사용하면 OrderService는 InventoryService 자체의 인스턴스를 생성하거나 수명 주기를 관리할 필요가 없습니다. 

대신 이러한 책임을 처리하기 위해 Spring IoC 컨테이너에 의존합니다.

OrderService 클래스의 @Component 주석은 Spring IoC 컨테이너에게 이 클래스의 인스턴스를 빈으로 생성하고 관리하도록 지시합니다. Spring 프레임워크에서 Bean을 선언하는 방법 중 하나이다.

반응형

Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

 

스프링부트에서 Swagger 를 사용하기 위해 pom.xml 에 dependency 추가하고 

<!-- Swagger 2 -->
<dependency>
	<groupId>io.springfox</groupId>
	<artifactId>springfox-swagger2</artifactId>
	<version>2.9.2</version>
</dependency>
	
<dependency>
	<groupId>io.springfox</groupId>
	<artifactId>springfox-swagger-ui</artifactId>
	<version>2.9.2</version>
</dependency>

루트패키지 하위에 SwaggerConfiguration 클래스 생성하고 

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

	@Bean
	public Docket api() {
		return new Docket(DocumentationType.SWAGGER_2)
				.apiInfo(apiInfo())
				.select()
				.apis(RequestHandlerSelectors.basePackage("루트.패키지")) // 패키지 범위 설정
				.paths(PathSelectors.any())
				.build();
	}

	private ApiInfo apiInfo() {
		return new ApiInfoBuilder()
				.title("API TEST with Swagger")
				.description("설명")
				.version("1.0.0")
				.build();
	}
}

실행했더니 오류가 났다... 하라는대로 했는데...

Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

 

열심히 구글링 해보니깐, 스프링부트 버전 변경으로 인해 몇몇 라이브러리에서 오류가 발생한다고 한다

Spring boot 2.6버전 이후에 spring.mvc.pathmatch.matching-strategy 값이 ant_apth_matcher에서 path_pattern_parser로 변경되면서 몇몇 라이브러리에서 오류가 발생함

오류처리 방법은 간단하다. application.properties에 설정값 하나만 추가해주면 된다.

# application.properties 사용시
spring.mvc.pathmatch.matching-strategy=ant-path-matcher


# application.yml 사용시
spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

 

추가 해주고 다시 재실행!! 

이상없이 정상적으로 실행되는걸 확인할수 있다.

 

반응형

'개발 티끌 팁 > JAVA' 카테고리의 다른 글

스프링 제어 반전(Ioc) 개념  (0) 2023.02.14
자바 스프링 vo 객체 복사  (0) 2022.07.13

 

 

 

 

파이썬(python)에서 숫자 3자리(천 단위)마다 콤마(,) 넣기는 3가지 방법이 있습니다. 

  1.  format() 
  2. 문자열 format
  3. f-string

1. format() 함수 활용 하여 콤마 넣기

    format(num, ',') 은 3자리마다 콤마를 넣어줍니다.

int_num = 10000000          # 정수형
float_num = 10000000.1001   # 실수형

print(format(int_num, ','))   #10,000,000
print(format(float_num, ',')) #10,000,000.1001

 

2. 문자열 format 활용 하여 콤마 넣기

    문자열 format 을 "{0:,}".format(숫자) 형식으로 작성하면 숫자 3자리 마다 콤마를 넣어 줍니다.

int_num = 10000000          # 정수형
float_num = 10000000.1001   # 실수형

print('{0:,}'.format(int_num))   #10,000,000
print('{0:,}'.format(float_num)) #10,000,000.1001

 

3. f-string 활용 하여 콤마 넣기

    f-string 포맷으로 f'{숫자:,}' 형식으로 작성하면 숫자 3자리 마다 콤마를 넣어 줍니다.

int_num = 10000000          # 정수형
float_num = 10000000.1001   # 실수형
 
print(f'{int_num:,}')    #10,000,000
print(f'{float_num:,}')  #10,000,000.1001

 

 

반응형

클래스간에 프로퍼티 복사
set으로 하나씩 하나씩 하기에는 귀찮음

스프링에서 제공하는 API 사용 하자

BeanUtils.copyProperties(source, target);
source : 원본 객체
target :  복사 대상 객체

BeanUtils.copyProperties(source, target, String ... ignoreProperites);
source : 원본 객체
target : 복사 대상 객체
ignoreProperities : 복사를 원하지 않는 프로퍼티명





반응형

 

자바스크립트 some(), indexOf(), lastIndexOf() 을 이용한 배열 중복 체크

화면단에서 유효성체크 작업중 배열에 값이 중복 값이 들어있는지 확인해야할 일이 생겼다.
정통적인 방법인 for문 돌려 체크하는 방법도 있지만, 이제 조금 세련된 방법으로 중복체크를 해보자

언제까지 for문만 돌릴껀가!!

일단 3가지 자바스크립트 함수에 대해 알아야 한다. 

 

1. some() 함수 

array.some(function(currentValue, index, arr), thisValue)

/*예시*/
const ages = [3, 10, 18, 20];
function checkAdult(age) {
  return age >= 18;
}
ages.some(checkAdult)   // Returns true

some() 함수는 callback이 참을 반환하는 요소를 찾을 때까지 배열에 있는 각 요소에 대해 한 번씩 callback 함수를 실행하여, 해당하는 요소를 발견한 경우 즉시 true를 반환하는 함수 입니다. 찾지 못하면 false 를 반환 합니다. 

https://www.w3schools.com/jsref/jsref_some.asp

 

JavaScript Array some() Method

JavaScript Array some() Example Check if any values in the ages array are 18 or over: const ages = [3, 10, 18, 20]; ages.some(checkAdult)   // Returns true function checkAdult(age) {   return age >= 18; } Try it Yourself » More "Try it Yourself" exam

www.w3schools.com

 

2. indexOf()

array.indexOf(item, start)

/*예시*/
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.indexOf("Apple")   // Returns 2

indexOf() 함수는 배열 안에서 찾으려는 값과 정확하게 일치 하는 '첫번째' 값의 index를 반환 합니다. 

https://www.w3schools.com/jsref/jsref_indexof_array.asp

 

JavaScript Array indexOf() Method

JavaScript Array indexOf() Example Search an array for the item "Apple": const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.indexOf("Apple")   // Returns 2 Try it Yourself » More "Try it Yourself" examples below. Definition and Usage The ind

www.w3schools.com

3. lastIndexOf() 

array.lastIndexOf(item, start)

/*예시*/
const fruits = ["Apple", "Orange", "Apple", "Mango"];
fruits.lastIndexOf("Apple") // Returns 2

lastIndexOf() 함수는 배열 안에서 찾으려는 값과 정확하게 일치 하는 '마지막' 값의 index를 반환 합니다. 

https://www.w3schools.com/jsref/jsref_lastindexof_array.asp

 

JavaScript Array lastIndexOf() Method

JavaScript Array lastIndexOf() Example Search an array for the item "Apple": const fruits = ["Apple", "Orange", "Apple", "Mango"]; fruits.lastIndexOf("Apple")   // Returns 2 Try it Yourself » More "Try it Yourself" examples below. Definition and Usage

www.w3schools.com

 

이 세 가지 함수를 조합하면 배열의 중복 값 여부를 체크할 수 있습니다.

var arr = ['a', 'b', 'c', 'a'];

function isDup(arr)  {
  return arr.some(function(x) {
    return arr.indexOf(x) !== arr.lastIndexOf(x);
  });  
}

var result = isDup(arr);

document.writeln(result);

1. some() 함수로 배열 arr의 값을 순서대로 callback 함수로 전달 하여 실행 arr.some(function(x) {});

2. 배열에서 x값의 index를 indexOf() 와 lastIndexOf() 로 확인 하여 같지 않으면 true 리턴 

   return arr.indexOf(x) !== arr.lastIndexOf(x);

   배열의 x값의 중복이 없다면 두 index 값은 동일 : false

                     중복이 있다면 두 index 값은 다름 : true

3.  some() 함수의 callback 함수는 중복이 존재하면 true를 리턴하고, 중복이 존재하지 않으면 false를 리턴

 

some() 함수를 이용하면 for문을 돌려서 체크 하는것보다 더 깔끔하고 세련되게 코드를 짤수 있다.

반응형

There is no statement named [DB 맵핑] in this SqlMap

There is no statement named [DB 맵핑] in this SqlMap 오류는 종종 발생하는데, 대부분의 원인은 쿼리호출 id 오타가 많다.

대소문자 구분좀..

There is no statement named 에러 발생시 아래 3가지 사항을 확인해주세요.

 


1. 쿼리문이 저장되어있는 XML의 ID 확인
<select id="
쿼리id" parameterClass="hashmap" resultClass="hashmap">

2. Java 파일에서 쿼리문 호출 ID 확인
select("
쿼리id", map);

3. sqlMapConfig.xml 파일에 등록 여부 확인
쿼리문을 등록하는 xml 파일에 쿼리문 xml이 등록되어있는지 확인

 


오타나 설정 하나로 몇시간씩 삽질하지 않기를 바랍니다~

반응형

1. 설치 

- Anaconda3 5.x 64비트 버전 설치 (파이썬 3.6 포함)


2. 텐서플로 설치 

- GPU가 없어 CPU 버전으로 ㅠㅠ 

- Anaconda Prompt 관리자 권한으로 실행 

- pip install tensorflow 입력 - 자동으로 설치됨


3. 설치확인 

import tensorflow as tf


print("tf.test.is_built_with_cuda():", tf.test.is_built_with_cuda())

print("tf.test.is_gpu_available():", tf.test.is_gpu_available())


# Undocumented feature

from tensorflow.python.client import device_lib as _device_lib

print(_device_lib.list_local_devices())



4. 결과

tf.test.is_built_with_cuda(): False

tf.test.is_gpu_available(): False

[name: "/device:CPU:0"

device_type: "CPU"

memory_limit: 268435456

locality {

}

incarnation: 14260437998891284931

]

반응형

GNB LNB SNB FNB 용어 정리


GNB ( Global Navigation Bar ) : 글로벌

사이트 최상위 전체 공통네비게이션.
메인메뉴, 대분류 메뉴, 전체 사이트에서 사용되는 공통메뉴바


LNB ( Local Navigation Bar ) : 로컬
현재 서비스 영역(Local)만 해당되는 네비게이션.
서브메뉴, 중분류 메뉴, 각 서브분류 별 사용되는 메뉴바
 
SNB ( Side Navigation Bar ) : 사이드
메인메뉴, 서브메뉴를 제외한 나머지 사이드메뉴, 기타메뉴바
 
FNB ( Foot Navigation Bar ) : 풋

하단메뉴, 하단로고, 주소, 카피라이팅 영역 


SNB( Side Navigation Bar ) 를 Sub Navigation Bar 로 혼동할수있다... 조심하자

반응형

[MySQL] 모든 공백 제거 

 

일반 적으로 공백제거에는 TRIM() 을 많이 사용하는데 TRIM()을 사용하면 앞, 뒤 공백만 제거 됩니다. 

 

그래서 모든 공백을 제거 하기 위해서는 REPLCAE()를 사용하세요.

 

 

select replace(필드명,' ',''

 

 

 

TRIM() 은 특정 위치에 문자나 공백을 제거하는데 더 효율적입니다.  

반응형

vi 에디터 자주쓰는 명령어 


학교 다닐때는 리눅스를 쓸일이 없었는데... 회사를 다니면서 쑬 일이 부쩍 많아졌다. 


정리중.... 


vi의 종료

먼저 <ESC>키로 명령모드로 전환 한후 종료 명령

<ZZ> 버퍼를 파일에 기록하고 종료

:wq 버퍼를 파일에 기록하고 종료

:q! 버퍼의 내용을 파일에 기록하지 않고 무조건 종료

:q 버퍼의 내용과 파일의 내용이 일치하는 경우 종료

 

텍스트 편집 명령

a 커서 뒤에 삽입

A 줄의 마지막에 삽입

i 커서 앞에 삽입

I 줄의 시작에 삽입

o 현재 커서의 다음에 빈 라인을 생성

O 현재 커서의 앞에 빈 라인을 생성

 

파일에 관한 명령

:r [파일명] 파일의 내용을 읽어와서 현재의 커서 아래에 삽입

:e! [파일명] 편집중인 파일을 무시하고 새로운 파일을 작성, 편집

:e [파일명] 새로운 파일을 작성, 편집

:n 파일 목록의 다음 파일로 이동

:w 현재 편집중인 파일을 저장

:w [파일명] 현재 편집중인 파일을 새로운 파일명으로 저장

w! [파일명] 현재 편집중인 파일을 현존하는 파일명으로 저장


커서의 이동 명령

1. 문자 단위 이동

h 한 문자 왼쪽으로

j 한 문자 아래로

k 한 문자 위로

l 한문자 오른쪽으로

→←↑↓ 화살표 발향으로 이동

[BackSpace] 한 문자 왼쪽으로

[Enter] 다음 라인의 시작으로


2. 라인에서의 이동

^ 또는 0 라인의 시작위치로

$ 라인의 끝 위치로

 

3. 페이지 단위 이동

[Ctrl]-f 한 페이지 위로

[Ctrl]-b 한 페이지 아래로

[Ctrl]-u 반 페이지 위로

[Ctrl]-d 반 페이지 아래로


4. 단어 단위 이동

w 한 단어 오른쪽으로 이동, 새 단어의 시작 문자에 위치,구두점을 한 단어로 인식

W 한 단어 오른쪽으로 이동, 새 단어의 시작 문자에 위치

b 한 단어 왼쪽으로 이동, 새 단어의 시작 문자에 위치,구두점을 한 단어로 인식

B 한 단어 왼쪽으로 이동, 새 단어의 시작 문자에 위치

e 한 단어 오른쪽으로 이동, 새 단어의 마지막 문자에 위치,구두점을 한 단어로 인식

E 한 단어 오른쪽으로 이동, 새 단어의 마지막 문자에 위치


5. 파일에서의 이동

G 파일의 끝으로 이동

nG 또는 :n n번째 라인으로 이동


6. 화면에서의 이동

H 화면의 첫줄로 이동

L 화면의 끝으로 이동

M 화면의 중간으로 이동

 

삭제 명령

1) 문자 단위 삭제

x 커서가 위치한 곳의 한 문자 삭제

nx n 개의 문자 삭제

X 커서가 위치한 곳 앞의 한 문자 삭제

nX n 개의 문자 삭제

2) 라인 단위 삭제

dd 한 라인 삭제

ndd n개의 라인 삭제

d0 또는 d^ 커서 위치부터 라인의 처음 까지 삭제

d$, D 커서 위치부터 라인의 끝 까지 삭제

3) 단어 단위 삭제

dw 커서 위치에서 오른쪽 한 단어 삭제

db 커서 위치에서 왼쪽 한 단어 삭제

4) d+이동명령

dh,dj,dk,dl,d0,d$

 

5) 파일에서의 삭제

dG 커서 위치부터 파일의 끝 까지 삭제

dnG 커서 위치부터 n번째 라인까지 삭제

   

복사 명령

1) 라인 단위 복사

yy 한 라인 복사

nyy n개의 라인 복사

y0 또는 y^ 커서 위치부터 라인의 처음 까지 복사

y$, Y 커서 위치부터 라인의 끝 까지 복사

2) 단어 단위 복사

yw 커서 위치에서 오른쪽 한 단어 복사

yb 커서 위치에서 왼쪽 한 단어 복사

3) 붙여 넣기

p 커서 위치에서 오른쪽에 붙여 넣기

P 커서 위치위 윗 줄에 붙여 넣기

 

수정 명령

(1) 문자 단위 수정

r 한 문자 수정후 명령 모드

nr n개의 문자를 수정후 명령 모드

R 한 문자 수정후 편집 모드

nR n개의 문자를 수정후 편집 모드

(2) 한 문자를 여러 문자로 수정

s 커서 위치에서 한문자 삭제 후 편집 모드

(3) 여러 문자를 수정

명령 수행 후 [ESC] 키로 마감

cw 현재 커서위치에서 오른쪽 단어 수정

cb 현재 커서위치에서 왼쪽 단어 수정

c0 또는 c^ 커서가 위치한 라인의 시작에서 커서 위치까지 수정

c$또는 C 커서의 위치에서 라인의 끝까지 수정

cc 한 줄을 모두 수정


라인의 결합

J 커서의 다음 줄을 커서가 있는 줄에 결합

 

명령 실행 취소 명령

u 직전의 한 명령 실행 취소(undo), 일부 시스템에서는 여러 명령 취소 가능

U 현재 라인에서의 명령들의 실행 취소

[Ctrl]-r 취소명령의 취소(redo), 일부 시스템에서만 지원


검색

/[패턴] 앞으로 이동하면서 [패턴]을 검색

?[패턴] 뒤로 이동하면서 [패턴]을 검색

n 반복 해서 이전에 지정된 [패턴]을 검색(next search)

 

기타 명령

:!command - 쉘로 나가지 않고 쉘명령을 수행

:sh - 쉘로 잠시 나감, 복귀하려면 exit

. - 직전 명령어 재수행

[CTRL]-g : 전체 줄수와 현재 커서가 위치한 줄 번호

~ - 대소문자 변경

vi 편집기의 환경 설정

:set nu - 라인번호 표시 설정

:set nonu - 라인번호 표시 설정 해제




반응형

+ Recent posts