이제는 정보 조회하기 들어간다...

환경설정이 끝나니깐 속도가 조금은 빨라진것 같아서 나만의 만족을 하며 연습한다.

 

1. 처음에 id로  회원정보를 하는데 앞서 테이블도 자동으로 설치되고 문제가 없는데 

자꾸만 NPE가 발생한다.

이상하다 이상하다 생각하다가 내가 만든 db가 RUN ON/OFF 진행시 초기화된다는 것을 발견!!

# DDL(create, alter, drop) 정의시 DB의 고유 기능을 사용할 수 있다.
spring.jpa.hibernate.ddl-auto=create

로 설정한것이 문제였다.......create는 실행시마다 초기화를 시킨다...

update로 수정했더니 문제 없지 조회되었다....베낄땐 조심^^ 블로그 그분은 이렇게 안시켰는데 너무 여러개를 검색하다가 

create가 좋아보여서 수정한것이 문제였다..^^

https://dev-coco.tistory.com/85 요분꺼 잘 정리되어 있습니다^^

 

2. 저장할때 보통 id는 자동생성했다...int값이니깐.....오라클에서는 시퀀스를 사용했는데.....

 myspq과 jpa모두 처음이라 검색도 어설프기만 하다....일단. 검색결과.

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

를 붙여주면 된다고해서 했는데...

 

Hibernate:

insert

into

member_entity

(address, admin_check, email, nick_name, phone, pw)

values

(?, ?, ?, ?, ?, ?)

2023-03-08 14:43:51.013 WARN 15412 --- [nio-8047-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1364, SQLState: HY000

 

java.sql.SQLException: Field 'id' doesn't have a default value

만 나온다...뭐가 문제가 해서 검색했더니....요건 또 금방 찾았다.....나같은 초보들 많은가 부다...심적 안정감.ㅍㅎㅎ 

 AI를 체크후에 Apply를 꼬~~~옥! 눌러준다....자꾸 덜 눌러서 안된다. 2번 일을 한다..^^

생성도 잘되고 값도 전달 되었다...

23.3.7 처음 lombok문제를 정리하고  3일정도 지났다.

그동안 다시 설치하고 다시 진행을하면서 @build @Getter @Setter에 다시 문제가 생기기 시작했다.

그냥 build.gradle 기재하여 설치 후 클래스 작성할 때는 문제가 없어서 잘되었나 보다 했는데

막상 buider() 나. 클래스.getId()같은 작업을 할때 안 읽히는 것이다...

설치도 잘되었는데 왜그런가 계속 검색하는데 이미 검색한것 밖에는 안나온다.

진행했다가 이클립스까지 완전 포맷한 경험으로 무서웠긴 하지만 방법이 안나오기도 하고

많은 사람들이 이렇게 글을 올릴 때에는 뭐가 답이 있어서 그런것이 아닌가 싶어서.

재시도 했더니 먹힌다.....ㅠㅠ

 

이부분 정리하면.

1. 먼저 build.gradle에 dependencies 에 버전까지 잘 작성해서 설치한다.

//lombok	
implementation 'org.projectlombok:lombok:1.18.22'
annotationProcessor 'org.projectlombok:lombok:1.18.22'

진행하다가 보니깐 버전이 낮아도 안된다고 해서 오늘기준으로 jdk17까지 커버하는 1.18.22.버전으로 설치했다. 

refresh gradle project한번 더해주고...

그리고 나서 jar파일 설치한다......

 

https://projectlombok.org/all-versions

 

older versions

 

projectlombok.org

나에게 맞는 버전 다운로드하고. 

lombok.jar 저장된곳에 가서 cmd 창열고 cd.. 해서 저장된곳가서 설치하는데

C:\shin_down\jdk11.0.17_8\bin>java -jar {C:\의 다운로드 경로}\Downloads\lombok-1.18.10.jar

전에 글은 오해했어요....블로그를 읽다 말았다보다...그냥 다운로드에 저장했다면 cd로 거기로 가면 된다. bin에서 할필요 없다...

 jar파일 설치하는데 가서 이클립스 없다고 하면 팝업되면 팝업끄고  이클립스 설치된 주소 넣어주면 된다.. install하니깐

3일전 처음할 때는 경고 문구 나왔는데 이번엔 아무런 메세지 없이 종료되었다.........좀매 무섭다....

ecilpse.ini 파일 열람하니.

-javaagent:C:\shin_down\eclipses\eclipses2212\eclipse\lombok.jar 라인도 자동을 생겼다...

긴장하면서 이클립스 재실행... 계속 빨간 라인있어서 gradle 를 refresh한번더 했더니.....

 

완전 행복하다.......망할 lombok

영상으로 공부중이고 안써봤던

1. @DeleteMapping  

2. @PathVariable   // 짝꿍 @RequestParam

3. 도움준 친구들  @GetMapping  / @PostMapping

관련한 정리를 합니다.

기본적 내용은 jsp에서 id입력해서 controll에서 값을 받는지까지입니다. 

전시간 정리했던 swagger로 한번더 확인하기 입니다.

 

1. @DeleteMapping  연습

	//controller
    @DeleteMapping(value="/member/deleteId/{id}")
	public String DeleteVariable(@PathVariable("id") int id) {
		
		System.out.println("회원탈퇴 하였습니다 : " + id);
		return "index";
	}
    
    //jsp파일
    <input type="int" id="delId" placeholder="번호입력하세요">
	<button id="delBtn">탈퇴</button>
    
    //스크립트
    	$('#delBtn').on('click', function(){
		var id = $('#delId').val();
		location.href="/member/deleteId?id=" + id;

에러~~~~~ jsp에는 post 또는 get만 된다는 것....혹시몰라서 void로도 해봤으나 주고 받기 모두 안됨...

현재 난 jsp파일로 화면구현을 하고 있기 때문에 요건 못쓰것다..  그래서 그냥 post와 get으로 하기로 함.

 

2번째 @PathVariable.....

@PostMapping(value="/member/deleteId/{id}")
public void DeleteVariable(@PathVariable("id") int id) {
    System.out.println("회원탈퇴 하였습니다 : " + id);
    return "index";
}

먼저 post로 변경하고 했더만....

2023-03-07 10:25:49.229 DEBUG 26592 --- [nio-8047-exec-9] o.s.web.servlet.DispatcherServlet : Completed 404 NOT_FOUND

2023-03-07 10:25:49.229 DEBUG 26592 --- [nio-8047-exec-9] o.s.web.servlet.DispatcherServlet : "ERROR" dispatch for POST "/error", parameters={}

2023-03-07 10:25:49.230 DEBUG 26592 --- [nio-8047-exec-9] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)

2023-03-07 10:25:49.230 DEBUG 26592 --- [nio-8047-exec-9] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json]

2023-03-07 10:25:49.230 DEBUG 26592 --- [nio-8047-exec-9] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Writing [{timestamp=Tue Mar 07 10:25:49 KST 2023, status=404, error=Not Found, message=JSP file [/WEB-INF/vie (truncated)...]

2023-03-07 10:25:49.231 DEBUG 26592 --- [nio-8047-exec-9] o.s.web.servlet.DispatcherServlet : Exiting from "ERROR" dispatch, status 404

가만보니 당연하다.... 요아이는  post인데 get 방식으로 넘겨준다....

jsp파일 수정

<p>회원탈퇴
<form action="/member/deleteId", method="post">
    <input type="int" name="id" placeholder="번호입력하세요">
	<button type="submit">탈퇴</button>
</form>

그래도 안된다....그래서 일단 익숙한

@RequestParam 변경한다.....

public String DeleteVariable(@RequestParam int id) {
    System.out.println("회원탈퇴 하였습니다 : " + id);
    return "index";
}

정상작동된다.....

왜일까.....검색또 시작 들어간다...

봐더니...특징이 있었던것이다....

@RequestParam 은 전달할때 주소 뒤 ? 이후 변수명=값?변수명=값?변수명=값 이고.

@PathVariable 은  url방식으로 주소뒤 /변수명/변수명/변수명 이렇게 추가되는 것이다.

 

결국  post방식으로 PathVariable도 안되는 것이다....."form으로 값을 전달하니깐"

 

그럼 다시 Get으로 돌아와서...

//jsp
 <input type="int" id="delId" placeholder="번호입력하세요">
 <button id="delBtn">탈퇴</button> 
 
  	$('#delBtn').on('click', function(){
		var id = $('#delId').val();
		location.href="/member/deleteId/" + id;		// '/'뒤에 붙는 것 유의
	})
    
    //controller
   	@GetMapping(value="/member/deleteId/{id}")
	public String DeleteVariable(@PathVariable("id") int id) {
		
		System.out.println("회원탈퇴 하였습니다 : " + id);
		return "index";
	}

콘솔도 잘 나오고 swagger도 200성공

마무리..정리.

1. @DeleteMappin  은 jsp파일에는 붙일 수 없다.

2. @PathVariable 은 post는 할수 없다. get으로 가야한다.

post를 쓸경우 전처럼 @RequestParam으로 값전달 한다...

 

혹시나 다른방법이 있는데 오늘의 내가 모를수 있다는거....양해부탁드립니다~~^^

 

지난 일 되짚기 한번만 먼저하자면....

lombok으로 진행하던건 계속 에러가 났고 모두다 다시 깔았다....이클립스는 22.12월 버전...jdk는 11버전으로 다시...전에는 꼬레토 11버전이라 이번껀 그냥 11버전으로 다시 설치했다.

이후gradle에서 그냥 하면 되는데 내가 autoWired걸었던 파일들이 문제가 있다...

아무래도 어노테이션을 잘못쓰고 있는데 이건 조금 공부를 더해야할것 같다...문제되던 클래스들 모두 삭제하고 다시 기본부터 재시작~!!! 모르는거 하다가 산으로 가지말고 아는것 부터 조금씩 가는게 나한테 맞는것 같다.

이제 다시 새로운 마음가짐으로 다시 진도를 뺀다!~

 

주워 들은건 있는데 어떻게 하는지는 몰랐던  swagger....마침 youtute 강의 중에 나오길래 진행해본다.

그전 비슷한건 먼저했다.

 이것도 비슷한 내용이였음...참고로 이것보다는 swagger가 좀더 편함..나는^^

==============================================================

환경설정

build.gradle의 dependencies 부분에 추가

    implementation 'io.springfox:springfox-swagger2'
	implementation 'io.springfox:springfox-boot-swagger:3.0.0'
    implementation 'io.springfox:springfox-swagger-ui:3.0.0'

근데 이걸했떠만. 그존의 설치했던. lombok이 안보인다......

다시 붙은 빨간줄!!

앞서서도  요놈들은 지금 진행하기 어려워 일단 어노테이션 모두 삭제하고 스웨거 집중!

저렇게 하니깐 gragle도 안된다고 한다.

implementation 'io.springfox:springfox-swagger2:3.0.0'	
implementation 'io.springfox:springfox-swagger-ui:3.0.0'

요것만 하니깐 정상진행되었다.

그래서 막 코딩했다...배겼다......블로그도 보고 강의도 보고...마구마구...열심히 쳤다.

 

@EnableSwagger2
@Configuration
public class SwaggerConfiguration {
	
	@Bean
	public Docket api() {
		return new Docket(DocumentationType.SWAGGER_2)
				.apiInfo(apiInfo())
				.select()
				.apis(RequestHandlerSelectors.basePackage("com.boot.jeong.controller"))  //기준이 될 내 패키지 기재
				.paths(PathSelectors.any())
				.build();
	}
	
	private ApiInfo apiInfo() {
		return new ApiInfoBuilder()
				.title("eunJeong.project.springBoot")                  // 제목같은거
				.description("Eunjung's Spring Boot Do It Yourself")   //스웨거가 먼지 설명
				.version("2.9.2")
				.build();
	}

에러.....페이지 못찾는덴다...

// @EnableWebMvc //기재하신분이 계셨는데 막상 하니.....에러남....
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
                .resourceChain(false);
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/swagger-ui/")
                .setViewName("forward:/swagger-ui/index.html");
    }

}

mvc패턴에선 이게 없으면 안된다고 하셔서 만들었는데 여기도에러나서 

@ enableWebMvc는 삭제......이건 직접 mvc를 설정한다는뜻이라서 @Configuration과 같이 쓰지 않음.....그래서 삭제함

 

하지만 다른 에러.....계속 에러남.....

버전이 무서워서 영상의 에러대로 2.9.2로 변경하였음....

run....반응이 달라짐...

마지막으로 

spring.mvc.pathmatch.matching-strategy=ant_path_matcher

 

한줄 더 넣으니 해결되었어..우와~~~~~~

 

그리고 마지막으로 아까 페이지 안보인다고 해서 만들었던. 

WebConfig 클래스를 삭제 해봤다....된다....ㅠㅠ

결론.....

1. 영상보고 할꺼면 영상만 보고 해라..... 블로거랑 섞지 말라!!!

2. 버전도 영상꺼 보고 해라......괜시리 시간지났다고 높은거 기재 말라.!!!!! 2.9.2. 는 먹히고....3.0.0.은 고려할께 많음...나의 부트가 2.7.9 버전이라 그러함...

 

오늘은 어쩃든 되는 모습을 확인하고 정리하게 되서 무진장 행복!!!!!!

 

 

Getter cannot be resolved to a type

어노테이션 그냥되는줄 알았더니..아니다..... 처음 설치할때 lombok Dependency 설정을 했는데.....에러가 난다.

검색하니....lombok은 이클립스에선 따로 설치해야한다고 한다..

https://projectlombok.org/download

 

Download

 

projectlombok.org

현재 버전은 1.18.26 인데..경험상 최신은 오히려 독임...

무서워서 1.18.10 버전정도에 다운을 시도함..

다운받고 설치하면 자동으로 설치화면이 나온다고 하는데.......

참고는 이분껄했다.

https://ojava.tistory.com/131

 

lombok @Data not working / getter setter 인식 불가 해결

언젠가 돌아오는 환경설정의 시간. 이번에도 환경설정하다가 시간을 많이 날린 관계로 미래의 나와 누군가를 위해 포스팅한다. 이번에 세팅하는 환경에서는 annotation을 통해 기능을 구현한 부분

ojava.tistory.com

그런데 나는 안나오는것이다...역시 구글...검색하니 나같은 케이스가 종종있다..

중요한건 이 jar파일 실행을 jdk가 있는곳에 가서 실행해야한다...

C:\shin_down\jdk11.0.17_8\bin>java -jar {C:\의 다운로드 경로}\Downloads\lombok-1.18.10.jar

실행하니 화면이 나온다...

아무 메세지 안떠서 그냥 엔터하니 종료되고 이클립스 재실행.,

시킨대로 eclipse.ini 갔더니...-vmargs에  문구없어서  

-xbootclasspath/a:lombok.jar추가.

(-javaagent:lombok.jar)은 있었음.......재실행 ..동일 에러

An error has occurred. See error log for more details.
Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @30d5e37c

에러를 검색하니 빌드 문제라고 한다......안되네...다시검색..

어떤분이

--illegal-access=warn
--add-opens java.base/java.lang=ALL-UNNAMED

두줄 더 넣으라고 하셨는데....안먹힌다...

 

어느분은 jdk충돌일수 있다고 안쓰는  jdk삭제하라고 하셨음...나도 17과 11이 ecilipse.ini에 같이 있어서 안쓰는 17버전 삭제...

-Dosgi.requiredJavaVersion=17
-Dosgi.instance.area.default=@user.home/eclipse-workspace
-Dsun.java.command=Eclipse
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM /////삭제함. 재실행...안먹힘..

 

다시검색하니. install new software에서 다운 가능하고 설치하니 된다고 하심...

 

Help-Install New Software 로가서 먼저 Work with입력창에

https://projectlombok.org/p2 입력 후 add한 다음 name에 lomgok을 입력하니....화면이 저렇게 나왔다

입력창에 무턱대고 모두 넣었을 때는 조회 안되었으니깐 참고하시길.....

녹색칸이 한참....걸리는줄 알았는데 뭐 몇분 소요.....

동의하고 종료되면 빌드 기다림..기다리면서 생각났는데 이번껀 최신버전이다.....좀 무섭다..

 

뭐 창 뜨는데 별수 있나 선택 하니 넘어간다. 완료되니 restart now 창 떠서 선택

-javaagent:C:\shin_down\eclipse\plugins\org.projectlombok.agent_1.18.26/lombok.jar

여기서 버전이 자동 변경되어 있었다.

 

그런데 오류는 바뀌지 않음......

dependencise에 구성이 안되어 있음을 발견........

build.gradle에 dependencies 에 추가를 안했다...

implementation 'org.projectLombok:lombok:1.18.26' 추가...

하지만 이메 빌드에서 에러가 발생되어서 아무것도 읽지 않는다.......

여기까지가 오전 4시간정도 씨름했던 부분인데......

여기서 다시 진행하면서 이클립스까지 안먹히기 시작했다

 

계속 검색하면서 warkspace의 .matadata손상이란 글들이 있었다.

산으로가는 에러를 보면서 가능성을 느끼면 워크스페이스를 다른 이름으로 진행해서 이클립스를 실행해봤으나 계속 이상발생... 결국은 이클립스 재설치...

build.gradle에 

implementation 'org.projectlombok:lombok:1.18.10'

annotationProcessor 'org.projectlombok:lombok:1.18.10'

넣었더니 깔린다.......수동으로 한 짓들은 뻘짓이였던 것인가........

Field mDto in com.boot.jeong.service.impl.MemberServiceImpl required a bean of type 'com.boot.jeong.dto.MemberDto' that could not be found.

어노테이션이 정상으로 돌아와서 실행했더니 저런 에러가 뜬다....

내가 만든 스프링 패키지의 어노테이션중 @Autowired 가 문제가 되고 있다....그리고 entity 클래스도 일단은 문제다....

결국은 lombok이 문제가 아니라 스프링부트 프로젝트를 잘못만들어서 에러가 나오던것이였다...ㅠㅠ

 

정리하면 lombok은 Dependencies설정할때 잘했던가...아니면 gredle에 잘 써서...버전까지 ...빌드하면 자동으로 설치한다..부트니깐......근데 저런 에러가 나온다면 그건 스프링의 문제인것이다...내가 만든 클래스에서 구성 문제가 생긴거 일수 있이니 참고해서 진행해야 한다...일단 종료!! 여기까지가 오후 4시간 헛질한  오늘의 결론이다...

 

 

 

다같이 jsp파일과 관련된겁니다...전에도 안되더만 외 index를 파일을 못찾는지 모르겠습니다.ㅠㅠ

검색해서 하란데로 해봐야 겠죠...

1. index파일의 위치....spring.mvc.view.prefix: /WEB-INF/views/ 설정한 요안에 잘있습니다.

2.빌드 재설정

		//jsp 쓸때 설정	
	implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.60'
	implementation 'javax.servlet:jstl:1.2'

3. 컷다가 다시 해보기.....

먹혔습니다..ㅠㅠㅠㅠㅠㅠㅠㅠ 눈물이 납니다....

설정해주는 건 기본인데 앞서서 jar로 시작하고 어쩌고 할때는 이래도 안되었습니다.

기본적으로 war로 설치하고 부트버전 낮추고. 하니 좀 되네요...

이제부터가 진정한 프로젝트의 시작입니다. ~~~~

준비단계 끝^^

사실 db설치부터 굉장히 고생했다.. 오라클.....회사서 설치하니 방화벽 머시기 땜시 2일을 죽도로 삭제 - 재설치 - 삭제 재설치.......무한반복했는데 선배님 왈 """설정부터 안되는건 안되는건여요.....쉬운거 하세요...일도 아니고 연습인데.....""

한말씀에 깨달음을 얻고 myspl로 갈아 탔다...쉽게 잘됐다......

도움은 검색과 생활코딩에서 동영상 한번 봤으니깐 참고하시길....

 

다시설치할때는 요롷게 함...

일단 스프링 버전부터 낮게.....jsp파일을 일단할꺼니깐 war...자바 11

스프링 web , mysql, jpa 이런거 미리 걸어서 깔았더니 훨씬 좋다...ㅋㅋ

jsp 파일 상속할 저파일이 자동 설치되어 있다...jar로 시작해서 안보이던 jsp파일생성도 막 보인다..ㅋㅋ

1차에러 

Multiple annotations found at this line:
- cvc-complex-type.4: Attribute 'version' must appear on element 
 'web-app'.
- Attribute: - version is required in element: - web-app Code:

검색해보니 버전 미설치라고 나옴

끝에 넣어주면 됨.
mysql DB 관련해서 설정을 안했다.

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

db설정을 안하고 넘어갔는데 빌드에서 걸렸다..

# MySQL 설정
spring.profiles.include=real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57InnoDBDialect
spring.session.store-type=jdbc

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 
# DB Source URL
spring.datasource.url=jdbc:mysql://<IP>:<Port/<DB>?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul

# DB username
spring.datasource.username=<이름>

# DB password
spring.datasource.password=<비번>
 
# true 설정시 JPA 쿼리문 확인 가능
spring.jpa.show-sql=true
 
# DDL(create, alter, drop) 정의시 DB의 고유 기능을 사용할 수 있다.
spring.jpa.hibernate.ddl-auto=update
 
# JPA의 구현체인 Hibernate가 동작하면서 발생한 SQL의 가독성을 높여준다.
spring.jpa.properties.hibernate.format_sql=true

# Logging
logging.level.org.springframework.web=DEBUG

이렇게 넣어줌....검색의 감사함..고마움...행복함..^^

java.sql.SQLException: Access denied for user '이름'@'localhost' (using password: YES)

이런에러가 났다.....계정설정을 안해서 인듯......

https://pika-chu.tistory.com/388

 

[Error] nested exception is java.sql.SQLException: Access denied for user '계정명'@'localhost' (using password: YES)] with ro

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nest

pika-chu.tistory.com

이분의 글을 참고해서 mysql 변경...했더만 에러변경

SQL Error: 1044, SQLState: 42000

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.SQLGrammarException: Unable to open JDBC Connection for DDL execution

 

저는 계정이 설정이 안되었다고 해서...cmd창으로 계정의 설정 삭제...무한반복하다가...

mysql 동영상강좌.....생활코딩과 이수안님의 강좌를 거진 3시간에 걸쳐서  다시 듣고......오라클과 비슷하나 다른듯....^^

드뎌 오타를 발견했습니다!!!ㅜㅜ db명칭 잘못적었습니다....수정하니 됩니다...

저는 지금 4일째 오라클과 인터넷 계정(회사에서 했더만), jsp파일....다시 mysql을 거쳐서 제자리입니다.^^

 

스프링 부트는 jsp파일을 못쓰게 한다....여러이유가 있어서 그렇겠지만 mvc 패턴으로 수업받던 내가

혼자 부트프로젝트를 하려니 여간 어려운게 아니다. 그중 jsp파일 관련해서 기록 남긴다....

일단 main > webapp 폴더생성> WEB-INF 폴더 생성> views 생성(이름은 맘대로)> index.jsp파일 만든다.

참고로 프로젝트생성을 할때 부트는 jar가 아니라 war로 생성해야 jsp파일 쓰는데 수월...안되는건 아니겠지만...검색에 또다시 몇시간 소요되니깐 참고하시길...

 

build.gradle에 환경설정해준다.

	//jsp 쓸때 설정	
	implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.60'
	implementation 'javax.servlet:jstl:1.2'
  	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'   //jps사용시 필수

 

application.propertie

spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp
server.servlet.jsp.init-parameters.development=true
#jsp 가능하능하도록 패키지 설정 및 jsp수정시 서버 재시작없이 바로 적용될 수 있게 설정

프로젝트생성시 메인이 들어간 JeongApplication.java에는

@SpringBootApplication

public class JeongApplication {

	public static void main(String[] args) {
		SpringApplication.run(JeongApplication.class, args);
		System.out.println("부트 출력");
	}

}

사실 jsp파일 넣기전까지 여기까지는 부트 작동이 잘되었는데 jsp한다고 설정넣기 시작하면서 에러와의 싸움이다.

여기서 잘안되니깐  jar를 war로 바꾼다...

@SpringBootApplication
public class JeongApplication extends SpringBootServletInitializer {

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		return application.sources(JeongApplication.class);
	}
	public static void main(String[] args) {
		SpringApplication.run(JeongApplication.class, args);
		System.out.println("부트 출력");
	}

}

 

build.gradle에 plugins에 id 'war'를 넣어준다....

 

 

그랬더만. 위에 보였던....jsp파일에 에러가 잡힌다. ㅠㅠ

The superclass "javax.servlet.http.HttpServlet", determined from the Dynamic Web Module facet version (2.4), was not found on the Java Build Path

에러 내용...

검색시 httpServlet경로 오류하며 

프로젝트 우클릭>Properties > Project Facets > Dynamic Web Module > Runtime 웹서버 체크하란다.

runtimes에 있는대로 설정해봄........재빌드했는데 에러 고대로...짜증...

프로젝트에 우클릭 serverRuntime이 없을 수 있다고 해서 들어갔더니 정말......추가해줌...

그런데 안되는거다..빌드도 다시하고 종료후 다시 해도 안되더니....어이없는 발견...

되는 jsp파일 있었던것이다.

 

 

비교해보시라.

아시겠는게....순서가 다르다.....이런 젠장...ㅠㅠ 욕나온다....

 

런실행하니...

 

java.lang.UnsupportedClassVersionError: org/springframework/boot/web/servlet/support/SpringBootServletInitializer has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55

에러 난다.

 

이유는 자바버전이  SpringBootServletInitializer(war로 변경하기 위해서 했던것)이라 안맞는다고 해서 17로 재설치 했떠니 톰캣하고 안맞는것이다.......너무 높댄다...

어제 하루동안 한일이 결국은 소용업는 일이 되고 말았다...

 

그래서 결국은 도합 12시간 밥머고, 쉬고, 잠자는 시간 빼고 했던 결국 2일치 일을 삭제하고...

프로젝트 다시만든다....

버전 낮게..ㅋㅋㅋㅋ

test 작성하다 private 메소드를 만났음....

 

처음 접해본 private아이들......엄청 당황했지만....역시 구글!!!
...사실 private 은 안하는거라고 하지만.......커러버리 60% 이상해야해서 할수있는건 모두해야했다.....생각보다 달성 어려움...
1. 리턴타입이 있는것

class 별세계 {
    private int 동물원(int 지역코드, spring  지역명){
        .
        .
        .
        return 동물수;
    }

}
    //test클래스에 Mock객체로 미리 별세계를 선언함....
    @Autowired
    pvivate 별세계 별세계;

    //private 메소드를 사용할꺼라고 선언했다.\
    Method method = 별세계.getClass().getDeclaredMethod("동물원", int.class, spring.class);
    method.setAccessible(true);

    //given 
     int 지역코드 = 1234;
     spring 지역명 = "경상도";

    //when
    int 동물수 = (int)method.invoke(별세계, 지역코드, 지역명);

    //then 리턴값 자체를 확인하기 어렵다면
    assertThat(동물수).isNotNull();
    
    //또는 리턴값이 확인되어 정확히 일치하는지까지 원한다면
    int 동물수 = ReflectionTestUtils.invokeMethod(별세게, 동물원, 지역코드, 지역명)
	assertThat(동물수,is(동물수의 값));  //isEqualTo와 같은 기능

 

2. 리턴타입 없는 것.... 이건 정말 까다롭니다...verify가 있다고 하는데

 private에 리턴값이 없으니 test 결과를 어떻게 해야할지...한참을 해맸고..

https://effortguy.tistory.com/144

 

[Java] Mockito 사용법 (4) - 검증 (Verify)

이번 포스팅에선 Mockito를 이용해 스터빙한 메소드가 제대로 실행이 됐는지 확인해보는 메소드에 대해서 알아보겠습니다. 스터빙한 메소드를 검증하는 방법 verify 메소드를 이용해서 스터빙한

effortguy.tistory.com

방법도 있었으나.....이것도 void는 몰라도 private은 검색 어려웠다.

검색 끝에 

class 별세계 {
    private void 동물원(int 지역코드, spring  지역명){
        .
        .
        .
        send.내가 좋아하는 동물(호랑이);
	}       
}

}
 
//then 
  try {
    	method.invoke(service, unsuitableInfo, totalActionCount);
  } catch (Exception e) {
   	 e.printStackTrace();
  }

이건 사실 미완성이다....된다고 한게 아니라..일단 test만 통과하게 값을 채운거라서.......

다른 방법이 있다면 알려주세요~~~~~~제발~~~~

'junit TEST' 카테고리의 다른 글

Junit Test builder()  (0) 2023.02.22
Test 연습하기  (0) 2023.02.01
TEST 로 --일단은 환경설정과 싸움/..완성시키기  (0) 2022.11.16
JUNIT TEST 하기  (0) 2022.11.09

테스트 할때 클래스 값주는 방법을 배워서 기록 남겨둠!!!

@Builder

스프링 부트에서 요놈은 참 편리.....어노테이션이 다~ 그렇긴 하다!

@Getter
@Setter
@Builder
@NoArgsConstructor      //JPA나 json parser 쓸때 꼭있어야하고
@AllArgsConstructor	//생성자를 직접 선언하고 모든 생성자에 @Builder 쓸거아님...넣어야함/안넘에러
public class 강원도 {

	private int 인구수;
	private int 가수수;
	private spring 시;
	private spring 동;
	private spring 길;
}

가정하자.......내고향 뽀록난다....다시짜기 귀찮으니 패스!

강원도 k = 강원도.builder()
        .인구수(400000)
        .가구수(400000)
        .시("많은시")
        .동("많은동")
        .길("여러길")
        .build();

이렇게 값을 줄 수 있다.

만약 리스트로 요청한다면.....

List<강원도> kList = List.of(강원도.builder()
                    .인구수(400000)
                    .가구수(400000)
                    .시("많은시")
                    .동("많은동")
                    .길("여러길")
                    .build());

근데 강원도class를 다른 클래스에서 합쳐서 사용한다면....

class 산<T> implement Serialzable {
    private spring 명산;
    private int 국립공원수;
    private List<T> 지역;
}
// 가정하에.....

산<강원도> mountain = 산.<강원도>builder()
                    .명산("설악산")
                    .국립공원수(10)
                    .지역(kList)
                    .build();

 

라고 하면 되었음.......나중에 잘 대입하기 위해서 쉽게쉽게 만들어 봤음......

여기서 참고로  Serialzable 은 이분의 글을 참조하면 될듯.....한번읽어서는 이해안됨...ㅋㅋ

/https://nesoy.github.io/articles/2018-04/Java-Serialize 

 

Java의 직렬화(Serialize)란?

 

nesoy.github.io

난 여기서 enum도 적용한 분의 클래스도 값을 줘야 했다...

 

public enum 소유자 implements GenericEnum<String> {

	COMPANY("C", "기업"),
	USER("M", "개인"),
	NON_MEMBER("N", "없음");

	private final String value;
	private final String description;

}

여기서 GenericEnum의 적용 원리는 이분걸 참조 하면 도움될 듯

https://vvshinevv.tistory.com/78

 

Enum과 Generic 함께 사용하기

개요 코드를 단순하게 만들면서 가독성을 높히기 위한 개발을 하다보면 Enum 타입을 사용하는 것은 흔하게 일어납니다. 또한 if / else 문 사용을 지양하는 방향으로 코드를 만들다 보면 Enum 클래스

vvshinevv.tistory.com

아까 적용한 산 클래스에 적용 해보자...뭐 내용상 안맞지만....나중에 다시 할수만 있으면 되니깐...

class 산<T> implement Serialzable {
    private spring 명산;
    private int 국립공원수;
    private 소유자 owner;
    private List<T> 지역;
    
}

산<강원도> mountain = 산.<강원도>builder()
                    .명산("설악산")
                    .국립공원수(10)
                    .owner(소유자.COMPANY)
                    .지역(kList)
                    .build();

이럴때 Builder 로 값을 줄때는 owner(소유자.COMPANY)...쉽지만....이걸 클래스 설정할 때 미리 계산되어야 한다는거....

쉽지 않는 길.....

참고로 같이 쓰였던 어노테이션들....

@Builder.Default  변수윗줄 기재하고 변수의 기본값을 넣어주면 builder로 값을 주지 않아도 초기값을 반환한다.

 

@SuperBuilder  @Builder처럼 어떤 객체의 필드값들을 편하게 지정하기 위해서 사용한다. 다만, super라는 말에서처럼 부모 객체를 상속받는 자식 객체를 만들 때, 부모 객체의 필드값도 지정할 수 있게 하기 위해서 사용한다

만드는 방법은 같은데 부모클래스의 변수값도 같이 적용된다는 것임

 

@NotNull(message = "장치 타입은 필수값입니다.")  말그래도 null거부!! builder를 할때 너무긴건 빼고 몇개만 추려서 생성했는데 NPE가 뜨길래 왠가 봤더니 저런게 있었다........값을 안주면 반환하지 않겠다는 클래스의 강한집착...!!줘야지 뭐 별수 있나...

 

 

junit도 하면서 공부하게 된다.^^

'junit TEST' 카테고리의 다른 글

junit private method ...and void  (0) 2023.02.22
Test 연습하기  (0) 2023.02.01
TEST 로 --일단은 환경설정과 싸움/..완성시키기  (0) 2022.11.16
JUNIT TEST 하기  (0) 2022.11.09

+ Recent posts