본문 바로가기
728x90

백엔드145

@Autowired 옵션 해당 옵션 적용시 해당 빈 객체 없어도 오류 안남 static class TestBean { @Autowired(required = false) public void setNoBean(Member noBean1) { System.out.println("noBean1 = " + noBean1); } @Autowired public void setNoBean2(@Nullable Member noBean1) { System.out.println("noBean1 = " + noBean1); } @Autowired public void setNoBean3(Optional noBean3) { System.out.println("noBean3 = " + noBean3); } } 2021. 8. 13.
컴포넌트 스캔 필터 (@ComponentScan) includeFilters : 컴포넌트 대상에 포함 excludeFilters : 컴포넌트 대상에 제외 컴포넌트 스캔 테스트 public class ComponentFilterAppConfigTest { @Test void filterScan() { ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class); BeanA beanA = ac.getBean("beanA", BeanA.class); Assertions.assertThat(beanA).isNotNull(); org.junit.jupiter.api.Assertions.assertThrows( NoSuchBeanDefinitionExcep.. 2021. 8. 12.
@ComponentScan @ComponentScan 은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다 이때 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다. * 빈 이름 기본 전략 : MemberServiceImpl 클래스 -> memberServiceImpl * 빈 이름 직접 지정 : 만약 스프링 빈의 이름을 직접 지정하고 싶으면 @Component("지정할 이름") @Component 어노테이션 붙은 클래스 스캔 @Configuration @ComponentScan public class AutoAppConfig { } @Component public class MemberServiceImpl implements MemberService { private final MemberRe.. 2021. 8. 12.
ApplicationContext란 1. BeanFactory 기능을 모두 상속받아서 제공한다 2. 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능은 물론이고, 수많은 부가기능이 필요하다. * 부가기능 1. 메세지소스를 활용한 국제화 기능 - 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력 2. 환경변수 - 로컬, 개발, 운영등을 구분해서 처리 3. 애플리케이션 이벤트 - 이벤트를 발행하고 구독하는 모델을 편리하게 지원 4. 편리한 리소스 조회 - 파일, 클래스패스, 외부 등에서 리소스를 편하게 조회 2021. 8. 10.
Bean 조회 2021. 8. 10.
스프링 빈 확인 및 출력 2021. 8. 10.
스프링 컨테이너 @Configuration, @Bean IoC를 적용할 java 파일 생성 후 클래스에는 @Configuration, 함수에는 @Bean 어노테이션 작성한다 스프링 컨테이너 생성 및 스프링 빈 사용 AppConfig.class 에서 가져올수 있는 getBean 첫 파라미터 name 종류 2021. 8. 9.
SOLID SRP : 단일 책임 원칙 * 한 클래스는 하나의 책임만 가져야 한다 * 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른것 예) UI 변경, 객체의 생성과 사용을 분리 OCP : 개방 - 폐쇄 원칙 * 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. * 다형성을 활용해보자 * 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현 * 지금까지 배운 역할과 구현의 분리를 생각해보자 LSP : 리스코프 치환 원칙 * 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀수 있어야 한다. * 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것, 다형성을 지원하기 위한 원칙, 구현한 구현체는 믿고 .. 2021. 8. 7.
Spring Boot Model을 사용하여 데이터 전송 model.addAttribute를 사용하여 데이터 전송 타임리프를 사용하여 members 가져오기(id, name은 Member클래스에서 Getter로 가져옴) 2021. 8. 4.
SpringBoot @PostMapping 해당 URL(/members/new)의 form 태그에서 Post가 발생하면 @PostMapping 어노테이션을 가지고 있는 컨트롤러에서 처리해준다 html에서 form태그 안에 요소중 name 속성을 가지고 MemberForm 클래스에 넣어준다 2021. 8. 4.
스프링 부트 테스트 같은 test폴더에 같은 패키지 경로로 테스트할 java파일 생성(MemoryMemberRepositoryTest.java) 테스트 코드 작성후 테스트할 함수에 @Test 어노테이션 작성 테스트 결과 올바르면 아무것도 표시 안되며 틀리면 에러가 표시된다. @AfterEach 에노테이션 2021. 8. 3.
스프링 AOP AOP 주요 용어 용어 의미 Joinpoint Advic를 적용 가능한 지점을 의미, 메소드 호출 필드 값 변경등이 Joinpoin에 해당 PointCut Joinpoint의 부분집합, 실제로 Advice가 적용되는 Joinpoint를 나타낸다. 스프링에서는 정규 표현식이자 AspectJ의 문접을 이용하여 Pointcut을 정의 Advice 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의. 메서드를 호출하기 전에 트랜잭션 시작(공통 기능) 지능을 적용한다는것을 정의하고 있다. Weaving Adivce를 핵심 로직 코드에 적용한다는 것을 Weaving이라고 한다. Aspect 여러 객체에 공통으로 적용되는 기능. 트랜잭션이나 보안등이 Aspect의 좋은 예이다. 세 가지 Weaving 방식 1. 컴.. 2021. 8. 3.
@ResponseBody 설명 @ResponseBody 를 사용 * HTTP의 BODY에 문자 내용을 직접 반환 * viewResolver 대신에 HttpMessageConverter가 동작 * 기본 문자처리 : StringHttpMessageConverter * 기본 객체처리 : MappingJackson2HttpMessageConverter * byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음 @GetMapping("hello-api") @ResponseBody // 해당 에노테이션이 있으면 리턴값으로 html로 전송, 또는 객체를 전송시 json으로 전송 public Hello helloApi(@RequestParam("name") String name) { Hello hello = n.. 2021. 8. 3.
gradlew.bat build 오류 IntelliJ에서 스프링부트로 개발할 때(빌드툴은 Gradle) 이전 프로젝트는 JDK 8버전을 쓰다가 새로운 프로젝트에서 JDK 11버전으로 올려서 Gradle Build를 수행하니 CompileJava 명령어 수행 중 처음보는 에러가 발생했다. 에러문구 : Execution failed for task ':compileJava'. > Could not target platform: 'Java SE 11' using tool chain: 'JDK 8 (1.8)'. 생전 처음보는 에러 문구에 JDK 설정이 잘못되었나 이곳저곳 찾아보았지만 설정은 JDK 11로 정상적으로 되어 있었다. File -> Project Settings -> Project File -> Project Settings -> Mod.. 2021. 8. 3.
String Boot 기본 Controller 1. GetMapping 어노테이션으로 URL 매칭한다. 2. html에 "data"라는 변수로 "hello!!" 값을 전송 3. hello.html로 전송(return 값) * 기본 템플릿 경로(src/main/resources/templates/(hello).html import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HelloController { @GetMapping("hello") // URL 매칭 public String hello(Model .. 2021. 8. 3.
JDBC /DAO, DTO Statement로 sql을 적용시키고, 같은 명령을 값만 바꿔서 더 빠르게 처리하기 위해서 PreparedStatement를 사용해서 아래 코드로 insert와 select를 만들었다. 그런데도 그 코드는 다른 기능과 함께 사용하려면 아마 함수나 객체로 만들어 처리하는게 더 가시적이고 편할 것이다. 즉 데이터베이스의 CRUD를 모듈화 한 것이 DAO이다. try{ Class.forName("com.mysql.jdbc.Driver"); String url ="jdbc:mysql://localhost:3306/hellojdbc?serverTimezone=UTC"; conn = DriverManager.getConnection(url, "root", "root"); System.out.println("연결 .. 2021. 7. 23.
JDBC API를 이용해서 두 개 이상의 쿼리를 트랜잭션으로 묶어서 처리 try { conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass); conn.setAutoCommit(false); //쿼리 실행1 //쿼리 실행2 // 트랜잭션 커밋 conn.commit(); } catch(Throwable e) { if (conn != null) { try { // 트랜잭션 롤백 conn.rollback(); } catch(SQLException ex) {} } occuredException = e; } finally { if (pstmtItem != null) try { pstmtItem.close(); } catch(SQLException ex) {} if (pstmtDetail != null) try { pstmtDeta.. 2021. 7. 23.
웹 어플리케이션 구동 시 JDBC 드라이버 로딩하기 JDBC 드라이버는 ㅎ한 번만 로딩하면 이후로 계속해서 사용할 수 있기 때문에 JSP를 실행할 때마다 JDBC 드라이버를 로딩할 필요가 없다 톰캣과 같은 웹 컨테이너가 시작될 때 자동으로 JDBC 드라이버를 로딩하도록 지정하면 JSP 페이지에서 매번 JDBC 드라이버를 로딩할 필요가 없다. package jdbc; import javax.servlet.http.HttpServlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; public class MySQLDriverLoader extends HttpServlet { public void init(ServletConfig config) throws ServletE.. 2021. 7. 23.
JSP LONG VARCHAR 타입 값 일어오기 (mysql) String history = null; // 스트림으로 읽어온 데이터를 저장한다 Reader reader = null; // LONG VARCHAR 데이터를 일어올 스트림 try { // 1.ResultSet 의 getCharacterStream()으로 Reader 구함 reader = rs.getCharacterStream("HISTORY"); // 스트림 일거옴 if (reader != null) { // 2. 스트림에서 일어온 데이터를 저장할 버퍼를 생성한다 StringBuffer buff = new StringBuffer(); char[] ch = new char[12]; int len = -1; // 3. 스트림에서 데이터를일어와 버퍼에 저장한다. while( (len = reader.read.. 2021. 7. 23.
JSP JDBC 이용해 mysql 연결 JDBC URL = jdbc:mysql://HOST[:PORT]/DBNAME[?param=value&param2=value2&...] MEMBER 테이블의 내용 이름아이디이메일 2021. 7. 23.
이클립스에서 JSP로 개발 시 파일 경로 설정 이해 Eclipse에서 JSP로 개발환경 설정 시 파일 경로 설정방법 테스트 과정 - 그림파일 준비 - 이클립스에서 Dynamic Web Project 생성 - 준비한 그림파일 WebContent아래에 복사 - 이미지파일을 보여주는 jsp코드 작성 - 경로 확민 및 변경하여 테스트(상대경로, 절대경로, 외부경로매핑) 1. 프로젝트 생성 후 다음 그림과 같은 위치에 그림파일을 위치시키고 JSP파일 생성 2. 클라이언트에 그림파일을 보여주도록 jsp코드 작성 3. 작성된 페이지 브라우저로 요청 결과 확인 4. 이미지 파일의 위치를 변경 5. jsp코드에서 그림 파일경로 수정 위 경로 설정은 상대경로이다. "image/my.png" 는 현재 페이지를 기준으로 image폴더 아래에 my.png파일을 지정하는 경로이다.. 2021. 7. 17.
이클립스 JSP 컴파일 위치 (서블릿 클래스) . 서버를 더블 클릭하면 나오는 화면에서 Open launch configuration 을 클릭 2. 팝업창에서 Arguments 탭을 클릭하여 Tomcat 과 연동되는 폴더가 어디인지 확인. 하단 이미지를 기준으로 Dcatalina.base 에 해당하는 폴더 밑에 work\Catalina\localhost 에 JSP 가 컴파일 됨. 즉, 전체경로는 D:\workspace_new\.metadata\.plugins\org.eclipse.wst.server.core\tmp4 폴더 밑에 있는 work\Catalina\localhost 가 되는 것임. 출처: https://rainny.tistory.com/118 [긍정적 사고방식^^] 2021. 7. 15.
org.apache.jasper.JasperException: JSP를 위한 클래스를 컴파일할 수 없습니다 ​ 에러 메시지 타입 예외 보고 메시지 JSP를 위한 클래스를 컴파일할 수 없습니다.: 설명 서버가, 해당 요청을 충족시키지 못하게 하는 예기치 않은 조건을 맞닥뜨렸습니다. 예외 org.apache.jasper.JasperException: JSP를 위한 클래스를 컴파일할 수 없습니다.: ​ ​ ​ 에러창 ​ 톰캣 실행이 오류인 듯하다. 콘솔창에서 server에 들어가 톰캣 -> 오른쪽 버튼 -> clean 클릭 그리고 서버를 재실행 해주면 정상 작동 ​ 참조 https://m.blog.naver.com/fullmoon_in_me/222063938399 2021. 7. 15.
이클립스에 아파치 톰켓 설치후 가동시 404에러 해결 해당 톰켓 더블클릭 -> Server Locations -> 2번째 체크(Use Tomcat Installation(~)) 후 저장 2021. 7. 15.
윈도우 아파치 톰캣 설치 startup.bat 실행시 한글 깨짐 1. 한글이 깨지는 이유 윈도우 환경에서 Tomcat을 bin폴더에 있는 startup.bat으로 실행시 한글이 깨지는 현상이 발생한다. 한글이 깨지는 이유는 cmd의 코드 페이지가 949 – ANSI/OEM으로 설정되어 있기 때문이다. 이를 Tomcat이 실행될 때 UTF-8로 실행되게 해주면 한글이 깨지지 않는다. 2. 해결방법 1) 레지스트리 실행 window키 + R -> regedit 으로 레지스트리 편집기 실행하고 컴퓨터\HKEY_CURRENT_USER\Console 로 이동하여 Console폴더에 오른쪽 마우스 클릭 -> 새로 만들기 -> 키 만들어진 키 폴더명을 Tomcat 으로 변경 2) cmd 실행 cmd를 실행( window키 + R -> cmd ) 하고 1 REG ADD HKCU\C.. 2021. 7. 14.
728x90