목록Java (116)
오늘은 몰랐으면 내일은 알면 된다
갖가지 삽질끝에 해결을 했으니 기록을 해둔다. build.gradle 을 설정하는 것은 여러 포스팅에서 공통적으로 하는 말이 있으니 대체로 그걸 따라하면 된다. https://hjjooace.tistory.com/entry/React-Spring-Gradle-Project-%EC%97%B0%EB%8F%99#none React + SpringBoot (Gradle) 손쉽게 연동하기 Environment OS : Windows 10 Intellij IDEA React와 SpringBoot(Gradle project)를 연동하는 방식을 게시했습니다. 세팅하는 과정의 순서는 아래와 같습니다. 1 - 1. Spring io를 이용해 스프링 부트 생성 1-2. 또는 IntelliJ hjjooace.tistory.c..
Boot에서 단위테스트를 하기 위해서는 @SpringBootTest 어노테이션을 붙여주면 된다. Junit은 jupiter 버전이 내장되어 있다. 그 외는 이전에 했던 방식대로 가면 되겠다. https://pieth.tistory.com/238 2022-12-07 (2) 단위 테스트 Junit도 어느새 버전이 5가 되었다. 사용하는 방법이 약간 바뀌었으니 사용 예를 봐두자. 설정파일이 class로 관리되고 있으므로 ContextConfiguration 어노테이션의 속성에는 classes를 사용한다. CustomerRep pieth.tistory.com
Jar 는 Java Archive, War 는 Web Archive이다. War는 Jar와는 다르게 ServletInitializer가 자동포함되는 차이가 있다. MVC 프로젝트가 될 수 있도록 만들어주는 것이다. ServletInitializer는 webapp의 내용을 WEB-INF에 옮겨주고, web.xml 을 읽어서 스프링 컨테이너를 구동할 수 있게 해준다. 그러나 내장 톰캣은 버전9로, Servlet API 4.0을 사용하기 때문에 web.xml을 사용할 일은 없을 것이다.(web.xml을 사용하지 않도록 권장함, 대신 설정용 클래스를 직접 만들어준다.) WEB-INF는 주소 url로 요청할 수 없는 특수경로이다. webapp 폴더가 필요한 이유는, 해당 폴더가 배포시에 서버에 그대로 복붙이 되기..
@SpringBootApplication을 좀 살펴보자. @ComponentScan에서의 excludeFilters 속성은, 이 클래스들은 제외하겠다는 뜻이다. 즉 속성 내에 적힌 것을 제외하고 현재 패키지와 하위 패키지들의 Component들(@Configuration, @Component, @Controller, @Service, @Repository)을 모두 scan 하겠다는 뜻이다. @SpringBootConfiguration은 Spring Boot용 컨테이너를 구동하기 위한 속성값이다. Spring Boot 컨테이너와 Spring Legacy 컨테이너는 다르진 않고, 다만 Boot가 좀 더 편의성이 좋아진 것 뿐이다. @EnableAutoConfiguration은 Component Scan을 통..
Boot 용 플러그인을 설치해보자. Eclipse Marketplace로 가서 STS라고 검색한다. 그러면 몇가지가 나오는데, STS3은 Legacy Project용이므로 설치를 해서는 안되겠다. STS4를 설치한다. 중간에 이런 문구가 보이면 체크후에 Trust Selected를 클릭한다. 그 다음 IDE를 재시작한다. Spring Boot는 Spring Framework의 더 간단한 버전이라고 보면 되겠다. Spring을 위한 라이브러리와 서버 등이 내장되어있다. Spring Boot 2버전은 Spring Framework 5버전을 편하게 개발하기 위한 버전이다. 앞선 실습에서는 Spring Framework 5.2를 썼으므로 Boot도 2버전을 사용한다. 왼쪽의 스펙을 보면 Boot에는 Tomcat..
게시글에는 제목과 내용이 있다. 이 게시글을 수정한다고 했을 때, 반드시 제목과 내용을 둘 다 수정하는 것은 아닐 것이다. 글제목만 수정하려면 요청전달데이터의 글내용에는 null 또는 ""이 전달 될 것이다. 반대로 글내용만 수정하려면 요청전달데이터의 글제목에는 null 또는 ""이 전달 될 것이다. 아래와 같은 컨트롤러에 Postman을 사용하여 수정 요청을 보내보자. boardContent는 빼고 보낼 것이다. 지금 현재는 이에 대한 처리가 없기 때문에 SQLException이 발생한다. 콘솔을 확인해보면 2번째 바인딩 변수에 setNull이 호출된 것을 확인할 수 있다. 여기서 구분해야할 점이 있는데, Java에서의 null은 아무 값도 참조하지 않는다는 뜻이고, Oracle에서의 null은 아무 ..
트랜잭션은 쪼개질 수 없는 하나의 작업 단위를 의미한다. 트랜잭션의 ACID 원칙은 다음과 같다. 분류 설명 원자성(Atomicity) 하나의 트랜잭션은 모두 하나의 단위로 처리되어야 한다. 한 트랜잭션의 작업이 A, B로 이루어져 있다면, A가 성공하고 B가 실패하는 경우, A와 B 모두 원래상태로 돌아가야만 한다. 즉, A와 B의 처리 결과는 모두 동일한 결과여야 한다. 일관성(Consistency) 트랜잭션이 성공했다면 DB의 모든 데이터는 일관성을 유지해야한다. 트랜잭션으로 처리된 데이터와 일반 데이터 사이에 차이가 없어야한다. 격리(Isolation) 트랜잭션으로 처리되는 중간에 외부에서의 간섭은 없어야만 한다. 영속성(Durability) 트랜잭션이 성공적으로 처리되면, 결과는 영속적으로 보관..
AOP는 관점 지향 프로그래밍(Aspect Oriented Programming)이며, 이때의 관점(Aspect)이라는 것은 개발자들에게는 관심사(Concern)라는 말로 통용된다. 또 관심사란, 개발 시 필요한 고민이나 염두에 두어야 하는 일이라고 생각할 수 있다. 파라미터가 제대로 들어왔는가? 올바른 권한을 가진 사용자인가? 예외는 어떻게 처리할 것인가? 위와같은 핵심 로직은 아니지만 필요한 관심사들은 AOP를 적용하지 않은 상태에서라면 반복적으로 코드에 반영하게 된다. (반복적으로 등장하는 try catch 등) AOP가 추구하는 것은 관심사의 분리이다. 개발자가 염두에 두어야하는 일들은 별도의 관심사로 분리하고, 핵심 비즈니스 로직만을 작성할 것을 권장한다. 더 간단히 생각해보자면, 관심사는 '주..
다음의 네가지 태그들을 이용한다. if choose(when, otherwise) trim(where, set) foreach [if] if는 test라는 속성과 함께 특정한 조건이 true가 되었을 때 포함된 SQL을 사용하고자 할 때 작성한다. 예시로, 검색조건이 T이면 제목으로 검색하고, 검색조건이 W이면 작성자ID로 검색한다고 해보자. 검색 조건값과 함께 test의 조건값도 전달되어야 하기 때문에 parameter는 map 형식이 되어야 한다. Map map = new HashMap(); map.put("opt", "T"); map.put("word", "%가%"); List list = session.selectList("매퍼네임스페이스.a", map); SELECT * FROM rep_boar..
앱의 시대가 열리면서 서버는 점차 순수 데이터를 제공하는 역할로 바뀌어왔다. 웹의 URI 또한 의미가 약간 달라져, 과거에는 페이지를 이동하더라도 브라우저의 주소는 변화하지 않는 방식을 선호했지만, 최근의 웹페이지들은 대부분 페이지를 이동하면 브라우저 내의 주소 역시 같이 이동하는 방식을 사용한다. REST는 Representational State Transfer의 약어로, 하나의 URI는 하나의 고유한 Resource를 대표하도록 설계된다는 개념에 전송방식을 결합해서 원하는 작업을 지정한다. /boards/123은 게시물 중에서 123번이라는 고유한 의미를 가지도록 설계하고, 이에 대한 처리는 요청시 GET, POST 등의 추가적인 정보를 통해서 결정한다. 요청을 보낼때, request body에 처..