- @참고: https://ottl-seo.tistory.com/entry/IntelliJ-Cannot-resolve-symbol-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0

 

상황

springboot initializr 로 프로젝트 생성 후 open 하는데, run 이 안 떴다. 

can't resolve springframework 라는 문구와 함께 springframework 쪽에 빨간색으로 import가 제대로 안되었다.

환경은 window, java 1.8 path 로 잡혀있었고, 프로젝트 설정은 maven, java 1.8, springboot 2.7.4였다.

프로젝트 구성에 뭔가 문제가 있나 싶어서 eclipse 로 가져와봤는데 잘 동작하였다.

해결해보기 위해 cache 지훈 후 rebuild 하고 였나, 

invalid target release: 17

Module my-module SDK 17 is not compatible with the source version 17.

Upgrade Module SDK in project settings to 17 or higher. Open project settings.

위와 같은 문구가 뜨길래

project settings 에서 17을 다운받아 설정했더니, 

org.codehaus.plexus.component.repository.exception.ComponentLookupException: com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method <init>()V not found
  at org.jetbrains.idea.maven.server.embedder.CustomModelValidator.<init>(Unknown Source)
  while locating org.jetbrains.idea.maven.server.embedder.CustomModelValidator
  at ClassRealm[maven.ext, parent: ClassRealm[plexus.core, parent: null]] (via modules: org.eclipse.sisu.wire.WireModule -> org.eclipse.sisu.plexus.PlexusBindingModule)
  while locating org.apache.maven.model.validation.ModelValidator annotated with @com.google.inject.name.Named(value=ide)

1 error
      role: org.apache.maven.model.validation.ModelValidator
  roleHint: ide

위와 같은 문구가 뜨면서 해결이 안된다.

 

아래 해결 방법 중 intellij 업데이트 및 rebuild 하니까 해결되었다.

 

해결 방법

1. 빌드 다시하기 

메뉴바 Build > Clean Project, Build > Rebuild Project

 

2. 캐시 비우고 재실행하기

메뉴바 File > Invalidate Caches / Restart

 

3. Gradle Refresh

메뉴바 Vew > Tool Windows > Gradle, 프로젝트명 우클릭 > Refresh Gradle Dependencies

 

4. Gradle 빌드 설정을 IntelliJ IDEA로 바꾸기

Preference창(Ctrl+Alt+S) > Build, Execution, Deployment > Build Tools > Gradle > Build and Run 등 설정을 IntelliJ IDEA로

 

5. IDE를 최신버전으로 업데이트하기

블로그 이미지

uchacha

개발자 일지

,

[Git] branch naming

Git 2022. 9. 21. 10:39

- @참고: https://junjunrecord.tistory.com/131

- @참고(git branch & naming): https://velog.io/@kim-jaemin420/Git-branch-naming

 

branch 네이밍 규칙

1) master branch, develop branch

그대로 사용이 일반적

2) feature branch

feature/기능요약 형식 추천. ex) feature/login

feature/{issue-number}-{feature-name} 의 이슈추적 형식. ex) feature/1-init-project, feature/2-build-gradle-script-write

3) release branch

release-{version} 형식 추천. ex) release-1.2

4) hotfix branch

hotfix-{version} 형식 추천. ex) hotfix-1.2.1

블로그 이미지

uchacha

개발자 일지

,

- imbedded tomcat 에 jndi 적용

https://jforj.tistory.com/128
1. build.gradle 에

org.apache.commons:commons-dbcp2 dependency 추가

2. resource 설정 클래스 JndiResource 생성

@Configuration
public class JndiResource {
	@Bean
	TomcatServletWebServerFactory tomcatFactory() {
		return new TomcatServletWebServerFactory() {
			@Override
			protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
				tomcat.enableNaming();
				return super.getTomcatWebServer(tomcat);
			}
			
			@Override
			protected void postProcessContext(Context context) {
				context.getNamingResources().addResource(getResource());
			}
		}
	}
	
	public ContextResource getResource() {
		ContextResource resource = new ContextResource();
		resource.setName("jndi/mysql"); // 사용될 jndi 이름
		resource.setType("javax.sql.DataSource");
		resource.setAuth("Container");
		resource.setProperty("factory", "org.apache.commons.dbcp2.BasicDataSourceFactory");
		
		// datasource 정보
		resource.setProperty("driverClassName", "com.mysql.cj.jdbc.Driver");
		resource.setProperty("url", "jdbc:mysql://localhost:3306/test?serverTimezone=UTC");
		resource.setProperty("username", "root");
		resource.setProperty("password", "root");
		return resource;
	}
}

3. applicaion.properties 에
spring.datasource.jndi-name: jndi/mysql

 

- external tomcat 에 jndi 적용

방법1 

https://pkguma.tistory.com/269
https://solbel.tistory.com/284
0. external war 로 build 하도록 설정

1. application.properties 에
spring.datasource.jndi-name:jndi/mysql

2. tomcat conf/server.xml 에 Resource 추가

<GlobalNamingResources>
	...
	<Resource auth="Container"
		name="jdbc/mysql"
		driverClassName="com.mysql.jdbc.Driver"
		type="javax.sql.DataSource"
		maxActive="8" maxIdle="8" maxWait="-1"
		url="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"
		username="root"
		password="root" />
</GlobalNamingResource>

3. tomcat conf/web.xml에 ResourceLink 추가

<Context>
...
	<WatchedResource>...
	<ResourceLink name="jdbc/mysql"
		global="jdbc/mysql"
		auth="Container"
		type="javax.sql.DataSource" />
</Context>

 

에러 해석

1. 

jndi 는 오타 등으로 Resource 정보가 잘못되었을 때 아래와 같이 DataSourceLookupFailureException 에러를 뱉었다.

jndi Resource 자체가 오타로 제대로 생성되지 않았을 경우에도 LookupFailure Exception을 던져서 해석하기 어려웠다.

[org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/JndiDataSourceAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException: Failed to look up JNDI DataSource with name 'jdbc/mysql'; nested exception is javax.naming.NameNotFoundException: Name [jdbc/mysql] is not bound in this Context. Unable to find [jdbc].

 

@참고(JSP에서 DB연동하기 - JNDI, DBCP 이용): https://all-record.tistory.com/104

 

방법2

1. application.properties 에
spring.datasource.jndi-name:jndi/mysql

2. tomcat conf/context.xml 에 Resource 추가

<Context>
	...
	<Resource name="jdbc/mysql"
		driverClassName="com.mysql.jdbc.Driver"
		type="javax.sql.DataSource"
		maxActive="8" maxIdle="8" maxWait="-1"
		url="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&amp;serverTimezone=Asia/Seoul"
		username="root"
		password="root" />
</Context>

 

 

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://www.delftstack.com/howto/batch/batch-file-wait-for-command-to-finish/

 

1. Use /WAIT to Wait for a Command to Finish Execution

/B : use to stay in the same process without creating a new window.

cmd /k : used to prevent the command prompt from exiting after execution.

@echo off
echo starting first program
START /B /WAIT cmd /c "C:\Users|Aastha Gas Harda\Desktop\testfile1.bat" > output.txt
echo The first program is executed successfully.
START /B systeminfo >> output.txt
echo ALL the programs are executed successfully
cmd /k

 

2. Use the TIMEOUT Command to Delay the Execution

time -1 : it wil act as a puase command to wait until a key is pressed.

/nobreak : to prevent user keystrokes.

- syntax

TIMEOUT /t <time (sec)>
@echo off
echo starting first program
START /B JRuler.exe
TIMEOUT /t 30
echo The first program is executed successfully.
START /B systeminfo >> output.txt
echo All the programs are executed successfully.
cmd /k

 

3. Use the PAUSE Command to Pause the Execution

puase the execution of a batch file until a key is pressed.

@echo off
echo starting first program
START /B cmd /c "C:\Users\Aastha Gas Harda\Desktop\testfile1.bat" > output.txt
echo The first program is executed successfully.
PAUSE
START /B systeminfo >> output.txt
echo All the programs are executed successfully
cmd /k

'Build' 카테고리의 다른 글

[Gradle] compile vs implementation  (0) 2022.03.14
블로그 이미지

uchacha

개발자 일지

,
블로그 이미지

uchacha

개발자 일지

,

@참고: https://stackoverflow.com/questions/9984223/what-happens-to-git-commits-created-in-a-detached-head-state

 

상황

detached head 상태인줄을 모르고 commit 한 후 다른 branch로 checkout 을 하였으며, commit 내역은 master에 merge 되어야 하는 부분이였다.

 

해결

1. commit 된 hash 값을 확인한다.

$git reflog
HEAD가 참조했던 commit들을 역순으로 보여준다. 특히 "lost" commit 내용도 볼 수 있다.

2. 해당 commit(SHA-1 해쉬값)을 끼고 별개로 새로운 임시 branch를 만든다.

$git branch solve_detach dac3n88

3. 본래 사용하던 branch로 checkout 하여 임시 branch와 merge 한다.

 

블로그 이미지

uchacha

개발자 일지

,

@참고: https://www.manualfactory.net/10147

1. ntp 설치
$yum install ntp

2. 동기화할 서버 주소 세팅
$vi /etc/ntp.conf

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.kr.pool.ntp.org
server 1.asia.pool.ntp.org
server 2.asia.pool.ntp.org
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst


3. 방화벽 설정
$firewall-cmd --add-service=ntp --permanent

4. 방화벽 다시 로드
$firewall-cmd --reload

5. ntp 서비스 시작
$systemctl start ntpd

6. ntp 서비스 상태 확인

$systemctl status ntpd

7. 시스템 재부팅 후에도 자동시작하도록 세팅
$systemctl enable ntpd

8. 작동 여부 확인
$ntpq -p

9. 동기화된 시간 확인
$date

블로그 이미지

uchacha

개발자 일지

,

[HikariCP] Configuration

DB 2022. 3. 25. 16:57

- @참고: https://github.com/brettwooldridge/HikariCP#artifacts

 

유용하게 쓰일만한 설정 몇가지를 짚어본다.

 

⏳connectionTimeout

이 property는 client가 pool로부터 connection을 기다리는 최대 miliseconds를 통제한다. 사용 가능한 connection을 받지 못하고 이 시간이 초과되면, SQLException이 thrown 된다.

최소 connection timeout 시간은 250 ms 이다.

Default: 30000 (30 sec)

 

⏳idleTimeout

이 property는 connection이 pool에서 놀게 허용하는 최대 시간을 조정한다.

오직 minimumIdlemaximumPoolSize 보다 작게 정의된 경우에만 적용된다. 

pool size가 minimumIdle과 같아지면 idle connection이 해제 되지 않는다.

연결이 idle(유휴) 상태에서 만료되는지되는 지 여부는 최대 +30초 변동성 및, 평균 +15초의 변동성이 있다. 이 시간 전에는 만료되지 않는다.

값이 0이면 idle connection은 절대 pool에서 제거 되지 않는다.

최소 값은 1000ms(10 sec) 이며, Default: 600000ms(10 min) 이다.

 

⏳keepaliveTime

이 property는 HikariCP가 database 나 network infrastructure에 의해 time out 되지 않게 하기 위해 얼마나 자주 connection을 살리기 위해 시도할 건지를 통제한다.

이 값은 maxLifetime 값보다 작아야 한다. (살아있는지 물으려면 죽기 전이여야 할 것이다.)

"keepalive"은 오직 idle connection에만 발생한다. 

connection이 "keepalive" 시간이 되면, connection은 pool에서 제거 되고, "pinged" 된 후 다시 pool로 반환된다.

"ping"은 다음 중 하나다.

JDBC4의 isValid() 메소드 호출이거나 connectionTestQuery 의 실행이다.

최소 값은 30000ms (30 sec) 이고, 분 단위가 가장 바람직하다. Default: 0 (disabled. 즉, 비활성화되는 값이다.)

 

⏳maxLifetime

이 property는 pool에 있는 connection의 최대 lifetime을 통제한다.

이 값을 세팅하길 강력히 추천하고, database나 infrastructure에서 부과한 connection time limit 보다 몇초 짧아야 한다.

0 값은 infinite lifetime 이며, idleTimeout 에 따른다.

최소 값은 30000ms (30 sec) 이며, Default: 180000 (30 min) 이다.

 

🔢minimumIdle

이 property는 HikariCP가 pool에 유지하는 idle connection의 최소 숫자를 통제한다.

만약 idle connection이 이 값 아래로 떨어지고 pool 의 총 connection 이 maximumPoolSize 미만이면, HikariCP 는 재빨리, 효과적으로 connction을 추가한다.

그러나, 최대 성능과 급증한 요구에 대한 응답을 위해, 이 값을 설정하지 말고, HikariCP가 고정 connection pool을 행하게 하는 걸 추천한다.

기본값: maximumPoolSize 값이다.

 

🔢maximumPoolSize

이 property는 idle 과 사용중인 connection을 통틀어 도달 가능한 최대 pool size를 통제한다. 기본적으로 이 값은 database backend에 대한 실제 connection 의 최대 개수를 결정한다.

합리적인 값은 실행환경에 의해 결정된다.

pool 이 이 사이즈에 도달하고, 사용가능한 idle connection이 없으면, getConnection() 호출은 time out 되기 까지 connectionTimeout milliseconds 만큼 block 된다.

블로그 이미지

uchacha

개발자 일지

,